在 findFirst() 之前使用 sorted() 进行流不再是懒惰的
我有一个元素列表,我需要找到满足条件的第一个元素,然后使用Java 8流退出。
我认为下面的代码不幸地评估了所有可用的元素,这不是我需要的,我需要逐个评估项目,并在找到第一个匹配项时停止():break
我在这里对元素进行排序,然后将元素映射到其属性,然后尝试过滤,如果不是空或空,则查找匹配项!url
url
first
Arrays.stream(dataArray)
.sorted(Comparator.comparing(d -> d.getPriority()))
.peek(o -> System.out.println("SORT: " + o))
.map(d -> d.getOriginalURL(shortUrl))
.peek(o -> System.out.println("MAP: " + o))
.filter(u -> u != null && !u.isEmpty())
.peek(o -> System.out.println("FILTER: " + o))
.findFirst().orElse("");
但输出显示,即使第一个项目与条件 () 操作匹配,也会计算所有项目。if
filter
Data[] data = new Data[] { new ParseData(), new InMemoryData() };
System.out.println(">>> " + getOriginalURL(data, ""));
输出:
SORT: mhewedy.usingspark.data.InMemoryData@7adf9f5f
MAP: InMemory URL
FILTER: InMemory URL
SORT: mhewedy.usingspark.data.ParseData@85ede7b
MAP: Parse.com URL <<< THIS SHOULD NOT HAPPEN
FILTER: Parse.com URL <<< AND THIS TOO
>>> InMemory URL
如输出所示,当过滤器与第一个元素匹配时,流不会停止,而是继续计算第二个元素!
我想这样做:
Arrays.sort(dataArray, Comparator.comparing(d -> d.getPriority())); // sort
for (Data data : dataArray) {
String url = data.getOriginalURL(shortUrl); // map
if (url != null && !url.isEmpty()) { // filter
System.out.println("url :" + url);
return url; // find first
}
}