根据条件创建从列表中删除重复项的地图

问题描述 投票:2回答:1

我想使用Java 8,lambda表达式根据条件获取不重复的列表。假设我有以下代码:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Main {

    class Person {
        private String name;
        private int age;

        public Person(String name, int age) {
           this.name = name;
           this.age = age;
        }

        public String getName() {
            return this.name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return this.age;
        }

        public void setName(int age) {
            this.age = age;
        }
    }

    public static void main(String[] args) {

        Main main = new Main();
        main.createList();
    }

    public void createList() {

        List<Person> p = new ArrayList<Person>();
        p.add(new Person("william", 34));
        p.add(new Person("billie", 62));
        p.add(new Person("Loise", 37));
        p.add(new Person("Margot", 12));
        p.add(new Person("billie", 63));
        p.add(new Person("billie", 61));

        System.out.println("show People initially");
        show(p);

        // It's going to be duplicated when it has the same name
        // It'll keep the older person. For example, for billie it should keep billie -> 63

        p = removeDuplicate(p, person -> buildPersonKey(person));

        System.out.println("show People After");
        show(p);

    }

    public void show(List<Person> pList) {
        for (Person p: pList) {
            System.out.println(p.getName() + "-Age: " + p.getAge());
        }
    }



    public <T> List<T> removeDuplicate(List<T> dataList, Function<? super T, ?> keyFunction) {
        return
                new ArrayList<>(dataList.stream()
                        .collect(Collectors.toMap(
                                p -> (keyFunction.apply(p)),
                                p -> p,
                                (oldValue, newValue) -> newValue))  
                        .values());
    }

    public String buildPersonKey(Person p) {
        return p.getName();
    }
}

这是我当前的输出:

show People initially
william-Age: 34
billie-Age: 62
Loise-Age: 37
Margot-Age: 12
billie-Age: 63
billie-Age: 61
show People After
william-Age: 34
billie-Age: 61 // Here I want "billie-Age: 63"
Loise-Age: 37
Margot-Age: 12

此行(oldValue, newValue) -> newValue))是关键,但是这里我需要的是if表达式,例如mapValueOld.getAge()> mapValueNew.getAge()吗? mapValueOld.getAge():mapValueNew.getAge()

任何想法我怎么能得到这个?谢谢

java-8 collectors
1个回答
1
投票

因为您的removeDuplicate方法是通用的,所以您必须将在同一个键的两个元素之间进行选择的函数传递给它:

public <T> List<T> removeDuplicate(List<T> dataList, Function<? super T, ?> keyFunction, BinaryOperator<T> chooser) {
    return
            new ArrayList<>(dataList.stream()
                    .collect(Collectors.toMap(keyFunction,
                                              Function.identity(),
                                              chooser))
                    .values());
}

并使用以下方法调用该方法:

p = removeDuplicate(p,
                    person -> buildPersonKey(person),
                    (p1,p2) -> p1.getAge() >= p2.getAge() ? p1 : p2);
© www.soinside.com 2019 - 2024. All rights reserved.