Java8:流优化,同一个实例调用同一个方法两次
Java 8: Stream optimization, invoke same method on the same instance twice
流是否有缓存或是否优化了相同的调用?
list.stream()
.filter(bean -> manager.find(bean.getID()).getApi() != null)
.peek(bean -> {
Entity entity = manager.find(bean.getID());
//... logic with entity here
}
});
manager.find()
在迭代过程中会被调用多少次?你能提出更好的方法来实现这段代码吗?
你可能想反过来做:
list.stream()
.map(bean -> manager.find(bean.getID()))
.filter(entity-> entity.getApi() != null)
.forEach(entity -> { /* logic here*/ });
回答
更改为:
list.stream()
.map(bean -> manager.find(bean.getID()))
.filter(bean -> bean.getApi() != null)
.forEach(bean -> {
//TODO
});
map
会在所有元素中转换调用manager.find,在内存中加载manager.find(bean.getID())
地图示例:
Stream.of(1,2,3,4,5,6).map(String::valueOf).forEach(System.out::println);
Stream.of(1,2,3,4,5,6)
-> 我们有一个 Integer 流
map(String::valueOf)
-> 我们将为流中的所有元素调用 String.valueOf(i)
,将其转换为字符串流。
forEach(System.out::println);
将打印所有元素(Now Strings)
链接
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
流是否有缓存或是否优化了相同的调用?
list.stream()
.filter(bean -> manager.find(bean.getID()).getApi() != null)
.peek(bean -> {
Entity entity = manager.find(bean.getID());
//... logic with entity here
}
});
manager.find()
在迭代过程中会被调用多少次?你能提出更好的方法来实现这段代码吗?
你可能想反过来做:
list.stream()
.map(bean -> manager.find(bean.getID()))
.filter(entity-> entity.getApi() != null)
.forEach(entity -> { /* logic here*/ });
回答
更改为:
list.stream()
.map(bean -> manager.find(bean.getID()))
.filter(bean -> bean.getApi() != null)
.forEach(bean -> {
//TODO
});
map
会在所有元素中转换调用manager.find,在内存中加载manager.find(bean.getID())
地图示例:
Stream.of(1,2,3,4,5,6).map(String::valueOf).forEach(System.out::println);
Stream.of(1,2,3,4,5,6)
-> 我们有一个 Integer 流
map(String::valueOf)
-> 我们将为流中的所有元素调用String.valueOf(i)
,将其转换为字符串流。forEach(System.out::println);
将打印所有元素(Now Strings)
链接
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