Java 8:流优化,在同一个实例上调用两次相同的方法

时间:2017-06-19 17:27:10

标签: java optimization java-8 java-stream monads

流是否有缓存或优化相同的调用?

    list.stream()
            .filter(bean ->  manager.find(bean.getID()).getApi() != null)
            .peek(bean -> {
                Entity entity = manager.find(bean.getID());
                //... logic with entity here
                }
            });

迭代期间会manager.find()调用多少次?你能提出更好的方法来实现这段代码吗?

2 个答案:

答案 0 :(得分:6)

你可能想要反过来做这件事:

list.stream()
   .map(bean -> manager.find(bean.getID()))
   .filter(entity-> entity.getApi() != null)
   .forEach(entity -> { /* logic here*/ });

答案 1 :(得分:6)

答案

将其更改为:

list.stream()
    .map(bean -> manager.find(bean.getID()))
    .filter(bean ->  bean.getApi() != null)
    .forEach(bean -> {
        //TODO
     });

map将转换所有元素中的call manager.find,并使用manager.find(bean.getID())

加载内存

地图示例:

Stream.of(1,2,3,4,5,6).map(String::valueOf).forEach(System.out::println);

  1. Stream.of(1,2,3,4,5,6) - >我们有一个Integer流
  2. map(String::valueOf) - >我们将为流中的所有元素调用String.valueOf(i),将其转换为String流。
  3. forEach(System.out::println);将打印所有元素(Now Strings)
  4. 链接

    https://www.mkyong.com/java8/java-8-streams-map-examples/

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

    http://www.concretepage.com/java/jdk-8/java-8-stream-map-example