相关疑难解决方法(0)

Java 8流逆序

一般问题:反转流的正确方法是什么?假设我们不知道流包含哪种类型的元素,那么反转任何流的通用方法是什么?

具体问题:

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)

我在这里想念的是什么?

java java-8 java-stream

135
推荐指数
13
解决办法
14万
查看次数

不可分裂的分裂器

我试图了解它是如何Spliterator工作的,以及如何设计分裂器.我认识到这trySplit()可能是更重要的方法之一Spliterator,但是当我看到一些第三方Spliterator实现时,有时我会看到他们的分裂器trySplit()无条件地返回null .

问题:

  1. 普通迭代器和Spliterator无条件返回null 之间有区别吗?看起来这样的分裂者似乎击败了分裂.
  2. 当然,有一些合法的分裂器用例有条件地返回null trySplit(),但是有一个无条件返回null的分裂器的合法用例吗?

java java-8 spliterator

11
推荐指数
1
解决办法
893
查看次数

使用Java 8获取列表的最后一个非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)

也许有人知道如何解决这个问题?

java lambda java-8 java-stream

7
推荐指数
1
解决办法
4937
查看次数

使用 Stream 从列表中查找与昂贵条件匹配的最后一个元素

我有大约一百万个元素的订单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,因此通过索引访问列表可能也很昂贵。

java list java-stream

7
推荐指数
1
解决办法
5901
查看次数

列表中是否有任何类型的reverse_iterator,只是为了反转List?(Java8流解决方案首选)

我想知道在List实现中是否存在某种类型的reverse_iterator(如c ++)ArrayList<Integer>.即,我想从列表的末尾而不是从头开始迭代?

有没有Java8流解决方案?

java collections java-8

1
推荐指数
1
解决办法
96
查看次数

标签 统计

java ×5

java-8 ×4

java-stream ×3

collections ×1

lambda ×1

list ×1

spliterator ×1