当前位置: 首页 > 知识库问答 >
问题:

Java streams压缩了两个列表

夏侯衡
2023-03-14

我有一个人的HashSet。一个人有一个名字,最后一个名字和年龄,比如:人(“汉斯”,“男人”,36)

我的任务是得到一份17岁以上的人的名单,按年龄对他们进行排序,并用姓氏来表示他们的名字,如:[“Hans Man”,“另一个名字”,“另一个名字”]

我只允许导入:

导入java.util.stream.流;导入java.util.stream.收集器;导入java.util.列表;导入java.util.ArrayList;

我的想法是先对它们进行排序,将名称映射到不同的流中,然后对它们进行压缩,但这不起作用。

public static void getNamesOfAdultsSortedByAge(Stream<Person> stream){

    Stream<Person> result = stream;
    Stream<Person> result1 = result.filter(p -> p.getAge() >= 18)
                            .sorted((x, y) -> Integer.compare(x.getAge(),y.getAge()));


    Stream<String> firstName = result1.map(Person::getFirstName);
    Stream<String> lastName = result1.map(Person::getLastName);

    Stream<String> result3 = concat(firstName, lastName);

    List<String> result4 = result3.collect(Collectors.toList());

    System.out.println(result4);
}

提前谢谢你

共有3个答案

郑声
2023-03-14

内部getNamesofadultsSortedBage方法:

stream
    .filter(p -> p.getAge() > 17)
    .sorted(Comparator.comparingInt(Person::getAge))
    .map(person -> person.getFirstName() + " " + person.getLastName())
    .collect(Collectors.toList())

我想它应该适合你的需要filter筛选只有18岁或以上的人,第二行排序由getAge谓词给出,第三行仅将Person实例映射到包含%firstName%%lastName%%的字符串,第四行将结果收集到列表中。

贺皓
2023-03-14

这不起作用:

Stream<String> firstName = result1.map(Person::getFirstName);
Stream<String> lastName = result1.map(Person::getLastName);

在第一个映射之后,的类型为字符串,它不适合Person::getLastName。您需要在第一个map()调用中进行连接。

祁永嘉
2023-03-14

你可以这样做:

public static void getNamesOfAdultsSortedByAge(Stream<Person> stream) {
    List<String> sorted = stream.filter(p -> p.getAge() >= 18)
                                .sorted((x, y) -> Integer.compare(x.getAge(),y.getAge()))
                                .map(e -> e.getFirstName() + " " + e.getLastName())
                                .collect(Collectors.toList());
    System.out.println(sorted);
}

在这里,我们只是通过连接第一个名字和最后一个名字来映射已排序的流,之后我们使用。收集()终端操作将其收集到列表中。

 类似资料:
  • 问题内容: 使用Google Guava(Google Commons),是否可以将两个大小相等的列表合并为一个列表,而新列表包含两个输入列表的复合对象? 例: 和 将输出: 问题答案: 从Guava 21开始,可以通过以下方式实现:

  • 问题内容: 我有两个列表,每个列表具有相等数量的项目。这两个列表如下所示: 我正在寻找一个看起来像这样的清单: 我试图使用这样的东西: 合并两个列表列表的最佳方法是什么?提前致谢。 问题答案:

  • Ziplist 是由一系列特殊编码的内存块构成的列表, 一个 ziplist 可以包含多个节点(entry), 每个节点可以保存一个长度受限的字符数组(不以 \0 结尾的 char 数组)或者整数, 包括: 字符数组 长度小于等于 63 ()字节的字符数组 长度小于等于 16383 () 字节的字符数组 长度小于等于 4294967295 ()字节的字符数组 整数 4 位长,介于 0 至 12 之

  • 问题内容: 我有一个熊猫数据框。我尝试将包含字符串值的两列首先连接到列表中,然后使用zip,我将列表的每个元素都用’_’连接。我的数据集如下: 我想将这两列连接到第三列,如下所示,分别用于数据框的每一行。 我已经使用下面的代码在python中成功完成了此操作,但该数据框非常大,并且需要花费很长时间才能为整个数据框运行它。我想在PySpark中做同样的事情以提高效率。我已经成功读取了spark数据框

  • 我正在用Java构建一个文件浏览器,并在JTrees中列出文件/文件夹。我现在想做的是,当我到达一个压缩文件夹时,我想列出它的内容,但不首先提取它。 如果有人有想法,请分享。