【问题标题】:Java 8 partition data from a list to two separate list [duplicate]Java 8将数据从一个列表分区到两个单独的列表[重复]
【发布时间】:2021-02-10 21:06:36
【问题描述】:

我从一个列表中派生出两个独立的组,错误数据和无错误数据:

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()

有没有一种方法可以使用对 .stream() 的一次调用将上述内容划分为单独的列表?这样做有性能提升吗?

然后如何访问这些数据?我想我需要使用地图?

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    首先,你的两个条件不分区原来的List。即第二个条件不是第一个条件的否定。

    如果你想要一个真正的分区,你可以使用Collectors.partitioningBy:

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

    第一个分区(满足条件)将通过partition.get(true)获得,第二个通过partition.get(false)获得。

    【讨论】:

    • 更新了条件。答案仍然适用吗?
    • @M06H 是的(针对旧版本的第一句话除外)。见Collectors.partitioningBy
    • @M06H 是的,现在partition.get(true) 将包含errorOnes 的元素和partition.get(false) nonErrorOnes 的元素。
    【解决方案2】:

    简介

    您可以使用 Java 8 收集器partitioningBy。因此,您可以将列表拆分为列表映射,然后从那里获取两个列表。

    短解

    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);
    

    完整示例

    @Data @Builder
        static
        class ProductHolder{
            PRecord record;
        }
    
        @Data @Builder
        static class PRecord{
            boolean x;  boolean y;
        }
    
    
      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

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2013-04-15
      • 2011-04-15
      • 1970-01-01
      • 2016-07-16
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多