Java 如何使用流比较列表中的元素?

Java 如何使用流比较列表中的元素?,java,for-loop,arraylist,foreach,java-stream,Java,For Loop,Arraylist,Foreach,Java Stream,例如,我需要遍历自定义列表list,并比较其中的项目。因此,对于for循环,它将如下所示 for(int i = 0; i < list.size()-1; i++) { for (int j = i + 1; j < list.size(); j++) { if (list.get(i).getSomeItem().equals(list.get(j).getSomeItem()){ /*modify the list usi

例如,我需要遍历自定义列表
list
,并比较其中的项目。因此,对于
for
循环,它将如下所示

for(int i = 0; i < list.size()-1; i++) {
    for (int j = i + 1; j < list.size(); j++) {
        if (list.get(i).getSomeItem().equals(list.get(j).getSomeItem()){
                /*modify the list using*/
                list.get(j).setSomeOtherItem(list.get(i).getSomeItem()+list.get(j).getSomeItem());
        }
    }
}
还是这个

 List<StorageModel> newList = list.stream()
           .filter(item -> item.getSomeItem.equals...)
List newList=List.stream()
.filter(项->项.getSomeItem.equals…)

因此,问题在于使用
forEach
时,两个循环都从同一个元素开始,并比较相同的项。对于流,我不知道如何获得下一个值。有什么方法可以做到这一点吗?

如果您有两个ArrayList A和B,您可以

  • A+B与A.addAll(B)
  • A-B与A.removeAll(B)
  • A∩ B带A.Retainal(B)
  • A∪ 复制A以设置A“然后A”。添加全部(B)

然后,如果需要,可以使用流来处理结果。但是,获取您感兴趣的所需子集(例如公共项或∩ B)并不是我想用Studio来做的事情。

,了解java提供的流API不仅仅是一个API,而是一个不同的编程范例,这一点非常重要。当您使用流时,您需要接受这个范例你告诉streams你想要实现什么,而不是你想要如何实现它。而且,与其他许多事情一样,使用流并不总是最好的解决方案。有时,使用普通的foor循环可以使代码更容易阅读,而且可能执行得也更好

使用流 如果您想在本例中使用streams,可以执行以下类似操作

据我所知,您正在尝试查找(基于某些标准)相同的元素。换句话说,您希望根据
模型
对象的属性值对元素进行分组

假设我们的
模型
类如下所示:

public class Model {
    private int id;
    private String name;

    public Model(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
下面的示例显示了如何根据模型列表中的元素的名称对其进行分组

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class CompareItems {

    public static void main(String[] args) {
        List<Model> items = Arrays.asList(
                new Model(1, "model_1"), new Model(2, "model_2"), new Model(3, "model_1"),
                new Model(4, "model_3"), new Model(5, "model_2"), new Model(6, "model_2"));

        Map<String, Set<Integer>> result = 
                items.stream()
                .collect(Collectors.groupingBy(Model::getName, Collectors.mapping(Model::getId, Collectors.toSet())));

        System.out.println(result);
    }
}
结果
对象中,您拥有一个模型的名称以及具有相同名称的所有模型对象的ID-s


根据您要执行的操作,您可以通过迭代
结果
对象将更改应用于每个组。

在这种情况下,您可以尝试使用reduce方法

list.stream().reduce((Item a, Item b)->{
        if(a.equals(b)){
            a.setValue(a.getValue()+b.getValue());
        }
        return b;
    });

真正重要的是“某些逻辑”是什么,通过流实现它。否则,不管怎样,每次迭代你们都会得到更好的结果。好吧,我的错!我将删除它。为什么要用使用流的东西替换使用传统for循环的工作代码?仅因为您使用的是Java8或更高版本,并不意味着所有内容都应该重写。@厄立特里亚人我正在尝试学习新东西,我认为这个问题会很有趣:)您想将
I
I+1
元素或
I
与列表中的其余元素进行比较吗@蜥蜴
{model_1=[1, 3], model_3=[4], model_2=[2, 5, 6]}
list.stream().reduce((Item a, Item b)->{
        if(a.equals(b)){
            a.setValue(a.getValue()+b.getValue());
        }
        return b;
    });