使用Java 8 Streams根据另一个列表过滤列表

时间:2019-10-20 20:33:33

标签: java java-8

我有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 + "]";
    }

}

1 个答案:

答案 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,然后第二次通过名称获取(如果存在)