bugfix> java > 投稿

私はリストから2つの別々のグループ、エラーデータとエラーのないデータを導き出しました:

List<ProductHolder> errorOnes = holderList.stream()
                                                      .filter(holder-> (holder.getRecord().isX() || holder.getRecord().isY()))
                                                      .collect(Collectors.toList());
List<ProductHolder> nonErrorOnes = holderList.stream()
                                                      .filter(holder-> (!holder.getRecord().isX() && !holder.getRecord().isY()))
                                                      .collect(Collectors.toList());

上記には複数の呼び出しがあります .stream()

を1回呼び出すだけで、上記を個別のリストに分割する方法はありますか? .stream() ?そうすることでパフォーマンスが向上しますか?

次に、これらのデータにアクセスする方法は?マップを使用する必要があると思いますか?

回答 2 件
  • <ストライク>まず第一に、あなたの2つの条件は元の条件を分割しません List 。つまり、2番目の条件は最初の条件の否定ではありません。

    真のパーティショニングが必要な場合は、 Collectors.partitioningBy

    Map<Boolean, List<ProductHolder>> partition = 
        holderList.stream()
                  .collect(Collectors.partitioningBy(holder-> (holder.getRecord().isX() || holder.getRecord().isY())));
    
    

    (条件を満たす)最初のパーティションは、 partition.get(true) 、および2番目の経由 partition.get(false)

  • イントロ

    Java8コレクターpartitioningByを使用できます。したがって、リストをリストのマップに分割し、そこから2つのリストを取得できます。

    List<ProductHolder> holderList = new ArrayList<>() {{
                add(ProductHolder.builder().record(PRecord.builder().x(true).y(false).build()).build());
                add(ProductHolder.builder().record(PRecord.builder().x(true).y(true).build()).build());
                add(ProductHolder.builder().record(PRecord.builder().x(false).y(false).build()).build());
                add(ProductHolder.builder().record(PRecord.builder().x(false).y(false).build()).build());
                add(ProductHolder.builder().record(PRecord.builder().x(false).y(false).build()).build());
            }};
    Map<Boolean, List<ProductHolder>> groups =
                holderList.stream().collect(Collectors.groupingBy(s ->!s.getRecord().isX() && !s.getRecord().isY()));
        
        List<ProductHolder> resultOne = groups.get(true);
        List<ProductHolder> resultTwo = groups.get(false);
    
    
    参考文献

    https://www.baeldung.com/java-list-split

あなたの答え