【问题标题】:How to dynamically add operation to stream in Java?如何在Java中动态添加操作到流?
【发布时间】:2018-09-02 02:03:18
【问题描述】:

我有以下代码:

private List<EmployeeDto> doTransformation(List<Employee> employees, Optional<Predicate<Employee>> filter, Integer limit, Integer offset) {

    Stream<Employee> stream = filter.isPresent() ? employees.stream().filter( filter.get() ) : employees.stream();
    // do offset sql based for stream //not working
    if ( offset != null ) {
       stream.skip( offset );
    }    
    // do limit sql based for stream //not working
    if ( limit != null ) {
        stream.limit( limit );
    }
    return stream
        .map( employee -> /*do some mapping to EmployeeDto*/ )
        .collect( Collectors.toList() );
}

在这部分代码中:

  1. 如果存在过滤器,则对流应用过滤器;
  2. 想要为此流做一些 offsetlimit 但这不起作用,因为“应该对流进行操作(调用中间或终端流操作)仅一次”。
  3. 映射到 dto 对象并收集为列表。

其他方式skip()limit()如何进行流操作? 提前致谢。

【问题讨论】:

  • stream = stream.skip( offset ); skiplimit 都返回修改后的流。它们不会更改原始流对象。 阅读文档。两者的 javadoc 都说:返回 new
  • 我无法重现这个。这是一个 examplefilteroffsetlimit 工作正常。请发布复制的 MCVE 以及您获得的完整异常。
  • 您遇到了什么问题?我已经用跳过和限制运行了你的例子,它工作正常。
  • @lexicore 你的那个代码不是动态应用skipfilter 只在需要的时候,那么这与这个问题有什么关系呢?
  • @badCoder 您需要手动处理它,因为 Java 不提供任何 API 来测试流是否关闭。

标签: java dynamic java-8 java-stream


【解决方案1】:

我做了这个小例子,也许对你有用?

Integer offset = null;
Integer limit = 2;

List<String> list = new ArrayList<>(Arrays.asList("batman", "one", "seven", "woohooo", "awesomeness"));
List<Integer> lengths = list.stream()
    .skip(offset != null ? offset : 0)
    .limit(limit != null ? limit : Integer.MAX_VALUE)
    .map(String::length) //as an example of mapping
    .collect(Collectors.toList());

lengths.forEach(System.out::println);

【讨论】:

  • limit(0) 不是无限的。
  • @Andreas 进行了更改
  • @JackFlamp 感谢 Jack,但这对我不好,Integer.MAX_VALUE 不好的做法,让我们想象一下有超过几十亿条记录 :)
  • @badCoder 因为您使用整数作为限制,所以无论如何您都不能再高了。为什么这是不好的做法?
  • @JackFlamp 有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
相关资源
最近更新 更多