一般问题:反转流的正确方法是什么?假设我们不知道流包含哪种类型的元素,那么反转任何流的通用方法是什么?
具体问题:
IntStream提供范围方法来生成特定范围内的整数IntStream.range(-range, 0),现在我要反转它切换范围从0到负不起作用,我也不能使用Integer::compare
List<Integer> list = Arrays.asList(1,2,3,4);
list.stream().sorted(Integer::compare).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
与IntStream我会得到这个编译器错误
错误:(191,0)ajc:
sorted()类型中的方法IntStream不适用于参数(Integer::compare)
我在这里想念的是什么?
我试图了解它是如何Spliterator工作的,以及如何设计分裂器.我认识到这trySplit()可能是更重要的方法之一Spliterator,但是当我看到一些第三方Spliterator实现时,有时我会看到他们的分裂器trySplit()无条件地返回null .
问题:
Spliterator无条件返回null 之间有区别吗?看起来这样的分裂者似乎击败了分裂.trySplit(),但是有一个无条件返回null的分裂器的合法用例吗?在Java 7中,如果我想获取列表的最后一个非null元素,我写这样的东西:
public CustomObject getLastObject(List<CustomObject> list) {
for (int index = list.size() - 1; index > 0; index--) {
if (list.get(index) != null) {
return list.get(index);
}
}
// handling of case when all elements are null
// or list is empty
...
}
Run Code Online (Sandbox Code Playgroud)
我想通过使用lambdas或Java 8的另一个特性来编写更短的代码.例如,如果我想获得第一个非null元素,我可以这样写:
public void someMethod(List<CustomObject> list) {
.....
CustomObject object = getFirstObject(list).orElseGet(/*handle this case*/);
.....
}
public Optional<CustomObject> getFirstObject(List<CustomObject> list) {
return list.stream().filter(object -> object != null).findFirst();
}
Run Code Online (Sandbox Code Playgroud)
也许有人知道如何解决这个问题?
我有大约一百万个元素的订单List,我正在寻找与特定条件匹配的最后一个元素,但条件计算起来很繁重,所以最好从末尾开始。总有大致log(n)匹配的元素,最少为 1 个。
我可以手动完成:
List<Element> elements = ...;
Element element = null;
for (var it = elements.listIterator(elements.size()); it.hasPrevious(); ) {
var candidate = it.previous();
if (heavyConditionPredicate.test(candidate)) {
element = candidate;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使用Streams 来编写此代码,这样就heavyConditionPredicate不会针对列表中的每个元素进行测试?如果 HeavyConditionPredicate 的计算量不会那么大,我会使用替代方法,但我没那么幸运。
请注意,elements可以是 的任何类型List,并且我得到的不一定实现RandomAccess,因此通过索引访问列表可能也很昂贵。
我想知道在List实现中是否存在某种类型的reverse_iterator(如c ++)ArrayList<Integer>.即,我想从列表的末尾而不是从头开始迭代?
有没有Java8流解决方案?