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;
});