我有2个列表。我需要在第二个列表中使用item.name
的排序顺序来对第一个列表进行排序。如果第一个列表中有多个具有相同名称的项目,则需要获取最大值。
是否可以将以下内容转换为使用Java 8流?
package com.dangdoogle.filterme;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class FunnyLists {
public static void main(String[] args) {
List<Item> firstList = new ArrayList<>();
List<Item> secondList = new ArrayList<>();
firstList.add(new Item("apple",20));
firstList.add(new Item("onion",80));
firstList.add(new Item("tomato",30));
firstList.add(new Item("apple",90));
firstList.add(new Item("onion",10));
secondList.add(new Item("onion"));
secondList.add(new Item("tomato"));
secondList.add(new Item("apple"));
secondList.forEach(item->{
firstList.forEach(key->{
if(item.getName().equals(key.getName()) && item.getValue() < key.getValue()) {
item.setValue(key.getValue());
}
});
});
secondList.forEach(System.out::println);
}
}
class Item{
Item(String name){
this.name=name;
}
Item(String name,int value){
this.name=name;
this.value=value;
}
private String name;
private int value;
public String getName() {
return name;
}
public int getValue() {
return value;
}
public void setName(String name) {
this.name = name;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
return "Item [name=" + name + ", value=" + value + "]";
}
}
答案 0 :(得分:1)
Map<String, Optional<Item>> maxValueMap = firstList.stream()
.collect(Collectors.groupingBy(Item::getName, Collectors.maxBy(Comparator.comparing(Item::getValue))));
List<Optional<Item>> secondListContainsItems = secondList
.stream()
.map(item -> maxValueMap.get(item.getName()))
.collect(Collectors.toList());
secondListContainsItems.forEach(System.out::println);
这是实用的方法,第一步是在名称上查找最大值,然后转换为map,然后第二次通过名称获取(如果存在)