Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用reduce函数时返回第一个元素_Java_Java 8_Stream_Java Stream_Collectors - Fatal编程技术网

Java 使用reduce函数时返回第一个元素

Java 使用reduce函数时返回第一个元素,java,java-8,stream,java-stream,collectors,Java,Java 8,Stream,Java Stream,Collectors,我正在使用java stream的reduce功能。 我的流数据如下所示: List<Person> persons = Arrays.asList( new Person("Max", 18), new Person("Peter", 23), new Person("Pamela", 23), new Person("David", 12), n

我正在使用java stream的reduce功能。 我的流数据如下所示:

List<Person> persons =
        Arrays.asList(
            new Person("Max", 18),
            new Person("Peter", 23),
            new Person("Pamela", 23),
            new Person("David", 12),
            new Person("Pam", 23));
persons.stream()
            .reduce((p1, p2) -> p1.age > p2.age ? p1 : p2)
            .ifPresent(System.out::println);
我得到的结果是

帕姆

但我的要求是元素彼得,因为它也有比其他人更大的价值

彼得

我怎样才能做到这一点?有其他替代方法吗?

试试:

persons.stream()
        .reduce((p1, p2) -> p1.age >= p2.age ? p1 : p2)
        .ifPresent(System.out::println);

请注意,我将条件从
p1.age>p2.age
更改为
p1.age>=p2.age
,以便优先选择与后一个实例年龄相同的较早的
Person
实例。

只需使用以下规则进行简化:

对于给定的两个人,
p1
p2

  • 如果
    p1.age
    ,结果应该是
    p2
  • 如果
    p1.age>p2.age
    ,结果应该是
    p1
  • 如果
    p1.age==p2.age
    ,结果应该是
    p1
  • 易于实施:

    persons.stream()
                .reduce((p1, p2) -> p1.age < p2.age ? p2 : p1)
    
    persons.stream()
    .减少((p1,p2)->p1.age

    PS:您当前的代码有一个typeo,并且将始终减少到列表中的最后一个元素,忽略年龄比较。

    它不是p1:p2(或反之亦然)而不是p2:p2吗?是的,它是p1:p2。编辑问题。
    .reduce((p1,p2)->p1.age>=p2.age?p1:p2)
    。顺便说一下,这与
    .max(Comparator.comparating(p->p.age))
    相同,或者,如果您关心性能,
    .max(Comparator.comparingit(p->p.age))
    编辑了这个问题