【发布时间】:2015-03-22 23:26:45
【问题描述】:
我正在寻找一种方法来模拟 Java 8 流的以下行为。 给定一个年份流,对它们进行排序,以便输出前 10 个值,这样 输出一年后,减少,迭代重新开始:
如果我输入 2005、2020、2000、1967 和 2018 年,我预计以下结果(限制为 10):
2020
2019
2018 2018
2017 2017
2016 2016 2016
2015 ...
我正在使用的测试是:
public class LazyTest {
public static void main(String[] args) {
Stream.of(2005,2020,2000,1967,2018)
.map(YearWrapper::new)
.sorted()
.limit(10)
.peek(year -> year.decreaseYear())
.forEach(System.out::println);
}
public static class YearWrapper implements Comparable<YearWrapper>{
private int currentYear;
public YearWrapper(int year){
this.currentYear=year;
}
public void decreaseYear(){
currentYear--;
}
@Override
public int compareTo(YearWrapper yearsToCompare) {
return Integer.compare(yearsToCompare.currentYear, this.currentYear);
}
@Override
public String toString(){
return String.valueOf(currentYear);
}
}
}
但似乎 sorted() 一点也不懒惰。整个排序在开始时进行一次,因此在任何进一步操作之前计算顺序,因此,示例的 5 个值是按顺序传递的,因此 reduce() 对迭代没有实际影响。
有没有办法让 sorted() 变得惰性并在流式传输下一个元素之前再次应用于剩余元素?
任何其他接近的方法将不胜感激!
【问题讨论】:
-
我没有得到输出。为什么2018年印了2次,2016年印了3次?
-
因为我预计 sorted 会在任何过滤元素改变其状态后进行操作,所以 2020 会减少并单独打印,直到轮到 2018 年
-
所以你想减少一个值直到它等于下一个值,然后你减少两个值直到它们等于第三个等等?在每次迭代期间,您打印出正在减少的值?限制会影响源值还是目标值?
-
Misha 的回答是我落后的,只是我不想读取对象而是改变它的状态,所以队列在后面
标签: sorting lambda java-8 lazy-evaluation java-stream