【问题标题】:Java8 Stream as a whole maps to a FunctionJava8 Stream 作为一个整体映射到一个函数
【发布时间】:2016-01-25 18:35:53
【问题描述】:

我想知道是否有更好的方法来使用 lambda 重写 groupA 方法作为链接操作的一部分?

public class Id {
    private final int value;
    public Id(int value) {
       this.value = value;
    }

    public int value() {
       return value;
    }
}

public class Ids implements Iterable<Id> { 
   private final List<Id> ids;

   private Ids(List<Id> ids) {
      this.ids = ids;
   }

   public static Ids of(List<Id> ids) {
      return new Ids(ids);
   }

   public Ids groupA() {
      return Ids.of(ids.stream()
                       .filter(id -> id.value() > 5)
                       .collect(Collectors.toList()));
   }

   @Override
   public Iterator<Id> iterator() {
      return ids.iterator();
   }
}

基本上我想做类似的事情

ids.stream()
   .filter(id -> id % 10 > 5)
   .collect(Collectiors.toList())
   .andThen(Ids::of);

想知道这是否可能

【问题讨论】:

    标签: java lambda functional-programming java-8 java-stream


    【解决方案1】:

    当然。你可以直接做

    Ids.of(ids.stream()
       .filter(id -> id % 10 > 5)
       .collect(Collectors.toList()))
    

    或者你可以将它添加到收集器中:

    ids.stream()
       .filter(id -> id % 10 > 5)
       .collect(Collectors.collectingAndThen(Collectors.toList(), Ids::of))
    

    【讨论】:

    • 当我执行 option2 时,这是使用 collectAndThen 的选项,编译器解释说有问题解决方法'of'
    • @peter 确切的错误是什么?看起来类型不太正确,因为您不能使用 id 类型为 Idid % 10
    • 虽然在这种情况下静态方法不是必需的。在这里,Ids::of 可以替换为Ids::new。除此之外,@peter 原来的方法有什么问题?
    • @peter 当我将它实际插入编译器时,我没有收到该错误。 ideone.com/pr1ryb
    • @peter 第一个性能稍微好一点,因为您没有分配 Collector 或 lambda。 JIT 或许可以优化它,但如果它不能提高可读性,那还有什么意义呢?
    【解决方案2】:

    在我的StreamEx 库中,有一个快捷方法toListAndThen 可以让这看起来更流畅:

    StreamEx.of(ids)
      .filter(id -> id % 10 > 5)
      .toListAndThen(Ids::of);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多