Java8 Stream作为一个整体映射到一个Function

时间:2016-01-25 18:35:53

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

我想知道是否有更好的方法可以将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);

并且想知道这是否可能

2 个答案:

答案 0 :(得分:10)

不确定。你可以直接做到这一点

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

答案 1 :(得分:2)

在我的StreamEx库中,有一个快捷方式toListAndThen,使其看起来更流畅:

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