【问题标题】:Sort stream of objects and get first and print out对对象流进行排序并首先获取并打印出来
【发布时间】:2019-04-29 10:11:37
【问题描述】:

我正在编写代码以按年龄对人员列表进行排序,并将其作为最旧的前缀并打印出来

定义的对象列表:

    Person person1 = new Person(40,"John", "Smith");
    Person person2 = new Person(45,"Mike", "Well");
    Person person3 = new Person(68,"Bob", "Parks");
    Person person4 = new Person(49,"Leon", "Foo");
    Person person5 = new Person(30,"Christian", "Markus");

    List<Person> personList = new ArrayList<>();
    personList.add(person1);
    personList.add(person2);
    personList.add(person3);
    personList.add(person4);
    personList.add(person5);

我可以对其进行排序和添加前缀,但问题是获取第一项并将其打印出来

    List<Person> orderedPersonAge  = personList
            .stream()
            .sorted(Comparator.comparing(Person::getAge).reversed())
            .map(s-> new 
    Person(s.getAge(),"Super"+s.getName(),s.getSureName()))
            .collect(Collectors.toList());
    System.out.println(orderedPersonAge);

我尝试使用 findFirst() ...

不同的方法是按年龄排序,取最旧的,然后添加前缀...

【问题讨论】:

  • I tried play with findFirst() - 你的问题是什么?
  • 在可选的 ifPresent 上失败,我认为也需要包括在内

标签: java sorting lambda java-stream


【解决方案1】:

你可以这样做

Person orderedPersonAge  = personList
        .stream()
        .sorted(Comparator.comparing(Person::getAge).reversed())
        .map(s-> new Person(s.getAge(),"Super"+s.getName(),s.getSureName()))
        .collect(Collectors.toList())
        .get(0);
System.out.println(orderedPersonAge);

Person orderedPersonAge  = personList
        .stream()
        .sorted(Comparator.comparing(Person::getAge).reversed())
        .map(s-> new Person(s.getAge(),"Super"+s.getName(),s.getSureName()))
        .findFirst()
        .get();
System.out.println(orderedPersonAge);

【讨论】:

  • 它可以正常工作并遵循我的原始路径,我的问题是我定义了List&lt;Person&gt; orderedPersonAge = personList 而不是Person orderedPersonAge = personList 抱歉发布格式
  • 与直截了当的.max(Comparator.comparing(Person::getAge)) 相比,他们每个人都在浪费资源,但在第一个变体中使用.collect(Collectors.toList()) .get(0) 会使其最大化……
  • @Holger 确实。
【解决方案2】:

你可能只是在寻找

personList.stream()
   .max(Comparator.comparing(Person::getAge)) // solves for sort with reverse and find first
   .map(s -> new Person(s.getAge(), "Super" + s.getName(), s.getSurname())) // map if present
   .ifPresent(System.out::println); // print the mapped output if present

【讨论】:

  • 这个解决方案对我来说绝对有意义,但返回 Error:(40, 27) java: incompatible types: void cannot be converted to java.util.List&lt;com.StreamTasks.Person&gt; 原因可能是 List&lt;Person&gt; orderedPersonAge = personList @talex 建议 Person orderedPersonAge = personList
  • @Paul 这只是一个void 调用,因为您想要执行的操作是消耗最大年龄的人。
  • 感谢您的补充意见
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2013-02-10
  • 2021-11-06
  • 1970-01-01
  • 2016-12-13
相关资源
最近更新 更多