第一次在这里提问,所以请对我宽容一点。:)无论如何,我不确定这是否可能使用Java 8流,但我很有兴趣学习。
假设我有以下有序的数字列表:
List<Integer> myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);
现在,我想在元素之间的差异大于2时,将这个列表拆分为多个列表。因此,最终结果将是三个不同的列表:
{1, 2, 3}
{7, 9}
{12, 13, 15}
我可以很容易地使用for循环并在循环时将当前元素与前一个元素进行比较来完成这个练习。然而,我想知道是否有一个简洁的方法来完成这个使用Java 8流?就像我之前说的,这只是为了我自己学习和理解Java 8所以如果这是不可能的,那也没关系。
提前感谢任何评论或回答。
好吧,我只能想到一个自定义收集器,因为您需要一些先前的状态,但这远远不够简洁(除非您将其隐藏在一个方法后面):
private static <T> Collector<Integer, ?, List<List<Integer>>> diffCollector() {
class Acc {
private Integer previous;
private List<List<Integer>> result = new ArrayList<>();
void accumulate(Integer elem) {
if (previous == null) {
previous = elem;
List<Integer> list = new ArrayList<>();
list.add(previous);
result.add(list);
return;
}
if (elem - previous > 2) {
List<Integer> oneMore = new ArrayList<>();
oneMore.add(elem);
result.add(oneMore);
previous = elem;
} else {
result.get(result.size() - 1).add(elem);
previous = elem;
}
}
Acc combine(Acc other) {
throw new UnsupportedOperationException("Not for parallel");
}
List<List<Integer>> finisher() {
return result;
}
}
return Collector.of(Acc::new, Acc::accumulate, Acc::combine, Acc::finisher);
}
用法为:
List<Integer> myList = Arrays.asList(1, 2, 3, 7, 9, 12, 13, 15);
System.out.println(myList.stream().collect(diffCollector()));
我对流完全陌生,目前正在尝试解决这个任务,我有以下两个列表:
问题内容: 我正在寻找一种最有效的方法,根据序列中缺少的数字将数字列表分成较小的列表。例如,如果初始列表为: 该函数将产生: 要么 会导致: 问题答案: 旧Python文档中的Python 3版本代码: 每当关键函数更改其返回值时,itertools模块中的函数都会生成中断。诀窍在于,返回值是列表中的数字减去列表中元素的位置。当数字中有空格时,此差异会更改。 该功能来自operator模块,您必须
问题内容: 给定一个数字列表,人们如何发现第()个元素与其第()个元素之间的差异? 使用表达式还是列表理解更好? 例如: 给定一个列表,我们的目标是要找到一个列表,因为,等等。 问题答案:
可能重复: 原始数组与ArrayList 在java中,列表和数组有什么区别?或数组和矢量之间的区别!
我有一个具体的问题。也有一些类似的问题,但这些问题要么与Python有关,而不是与Java有关,要么即使问题听起来类似,需求也不同。 我有一份价值观清单。 最后,我想根据列表的值对列表进行拆分。我的意思是,如果值大于零,它将保留在原始列表中,负值列表中的相应索引将设置为零。如果该值小于零,它将转到负值列表,原始列表中的负值将替换为零。 结果列表应该是这样的; 有没有办法解决这个流api在Java?