相关疑难解决方法(0)

可以为java中的每个循环以相反的顺序执行a操作吗?

我需要使用Java以相反的顺序运行List.

所以这是前进的地方:

for(String string: stringList){
//...do something
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用for each语法以相反的顺序迭代stringList ?

为了清楚起见:我知道如何以相反的顺序迭代列表但是想知道(出于好奇心)如何在每个样式中执行它.

java foreach reverse

143
推荐指数
5
解决办法
11万
查看次数

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万
查看次数

使用 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
查看次数

线程安全的 CopyOnWriteArrayList 反向迭代

考虑以下代码片段:

private List<Listener<E>> listenerList = new CopyOnWriteArrayList<Listener<E>>();

public void addListener(Listener<E> listener) {
    if (listener != null) {
        listenerList.add(listener);
    }
}

public void removeListener(Listener<E> listener) {
    if (listener != null) {
        listenerList.remove(listener);
    }
}

protected final void fireChangedForward(Event<E> event) {
    for (Listener<E> listener : listenerList) {
        listener.changed(event);
    }
}

protected final void fireChangedReversed(Event<E> event) {
    final ListIterator<Listener<E>> li = listenerList.listIterator(listenerList.size());
    while (li.hasPrevious()) {
        li.previous().changed(event);
    }
}
Run Code Online (Sandbox Code Playgroud)

有一个可以修改和迭代的监听器列表。我认为前向迭代(参见方法#fireChangedForward)应该是安全的。 问题是:反向迭代(参见方法#fireChangedReversed)在多线程环境中也安全吗? 我对此表示怀疑,因为涉及两个调用:#size 和#listIterator。 如果它不是线程安全的,那么在以下情况下实现#fireChangedReversed的最有效方法是什么:

  • 优化遍历
  • 如果可能的话避免使用锁定
  • 避免使用 javax.swing.event.EventListenerList
  • 更喜欢不使用第三方库的解决方案,例如可以在自己的代码中实现

java collections

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

标签 统计

java ×4

java-stream ×2

collections ×1

foreach ×1

java-8 ×1

list ×1

reverse ×1