相关疑难解决方法(0)

为什么不建议使用基于AtomicInteger的Stream解决方案?

说我有这个水果清单: -

List<String> f = Arrays.asList("Banana", "Apple", "Grape", "Orange", "Kiwi");
Run Code Online (Sandbox Code Playgroud)

我需要在每个水果前面加一个序列号并打印出来.水果或序列号的顺序无关紧要.所以这是一个有效的输出: -

4. Kiwi
3. Orange
1. Grape
2. Apple
5. Banana
Run Code Online (Sandbox Code Playgroud)

解决方案#1

AtomicInteger number = new AtomicInteger(0);

String result = f.parallelStream()
        .map(i -> String.format("%d. %s", number.incrementAndGet(), i))
        .collect(Collectors.joining("\n"));
Run Code Online (Sandbox Code Playgroud)

解决方案#2

String result = IntStream.rangeClosed(1, f.size())
        .parallel()
        .mapToObj(i -> String.format("%d. %s", i, f.get(i - 1)))
        .collect(Collectors.joining("\n"));
Run Code Online (Sandbox Code Playgroud)

为什么解决方案#1是一种不好的做法?我在很多地方已经看到AtomicInteger基础解决方案很糟糕(比如在这个答案中),特别是在并行流处理中(这就是我使用上面的并行流来尝试遇到问题的原因).

我查看了这些问题/答案: -
在哪些情况下,Stream操作应该是有状态的?
使用AtomicInteger在Stream中进行索引是一种合法的方式吗?
Java 8:计算lambda迭代的首选方法?

他们只是提到(除非我错过了什么)"可能会出现意想不到的结果".像什么?它可以在这个例子中发生吗?如果没有,你能为我提供一个可能发生的例子吗?

至于" 不保证应用映射器函数的顺序 ",那么这就是并行处理的本质,所以我接受它,而且,在这个特定的例子中,顺序无关紧要.

AtomicInteger 是线程安全的,所以它不应该是并行处理的问题.

有人可以提供使用这种基于状态的解决方案时会出现问题的示例吗?

java thread-safety java-8 java-stream atomicinteger

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

将列表总结为流的限制

如何获取记录,计数总和应该在限制内。在下面的示例中,Records对象包含 recordId 和计数,我想根据计数的总和应该小于或等于我的限制条件来获取记录数据。

public class Records {
    private int recordID;
    private int count;

    public Records(int recordID, int count) {
        this.recordID = recordID;
        this.count = count;
    }

    public int getRecordID() {
        return recordID;
    }

    public void setRecordID(int recordID) {
        this.recordID = recordID;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}


public static void main(String[] args) {
    
    final List<Records> recordList = new ArrayList<>();
    
    recordList.add(new Records(100, 10));
    recordList.add(new Records(501, 20));
    recordList.add(new …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

如何在Java Stream中增加一个值?

我想增加index每次迭代的值1.很容易实现for-loop.变量image是一个数组ImageView.

这是我的for-loop.

for (Map.Entry<String, Item> entry : map.entrySet()) {      
    image[index].setImage(entry.getValue().getImage());
    index++;
}
Run Code Online (Sandbox Code Playgroud)

为了练习Stream,我尝试将其重写为Stream:

map.entrySet().stream()
    .forEach(e -> item[index++].setImage(e.getValue().getImage()));
Run Code Online (Sandbox Code Playgroud)

导致我错误的原因:

错误:从lambda表达式引用的局部变量必须是final或者有效的final

如何重写Stream递增index要使用的变量?

java dictionary java-8 java-stream

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