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

Java 8中获取属性列表的优化方法?

萧允晨
2023-03-14

我的问题是这个问题的延伸。

要获得属性列表,我们可以使用以下代码:

List<String> namesList = personList.stream()
                                   .map(Person::getName)
                                   .collect(Collectors.toList());

但是如果我想得到100个不同的属性。

选项#1:

List<Integer> ageList = personList.stream()
                                   .map(Person::getAge)
                                   .collect(Collectors.toList());

List<String> surnamesList = personList.stream()
                                   .map(Person::getSurname)
                                   .collect(Collectors.toList());

List<String> fathersNamesList = personList.stream()
                                   .map(Person::getFathersName)
                                   .collect(Collectors.toList());

List<String> mothersNamesList = personList.stream()
                                   .map(Person::getMothersName)
                                   .collect(Collectors.toList());

那么,重写这一行100次会更好吗?或者我应该简单地运行1个循环并收集那里的所有属性。

选项2:

for(Person person : persons) {
    namesList.add(person.getName());
    surnamesList.add(person.getSurname());
    fathersNamesList.add(person.getFathersName());
    ...
}

共有3个答案

尚鸿才
2023-03-14

使用Streams,更接近循环方法的解决方案是创建自定义聚合类型:

class AggregatedPersonDetails {
    List<Integer> ageList = new ArrayList<>();
    List<String> surnamesList = new ArrayList<>();
    List<String> fathersnamesList = new ArrayList<>();
    List<String> mothersnamesList = new ArrayList<>();

    public void add(Person person) {
        ageList.add(person.getAge());
        surnamesList.add(person.getSurName());
        fathersnamesList.add(person.getFathersName());
        mothersnamesList.add(person.getMothersName());
    }

    public AggregatedPersonDetails merge(AggregatedPersonDetails other) {
        ageList.addAll(other.ageList);
        surnamesList.addAll(other.surnamesList);
        fathersnamesList.addAll(other.fathersnamesList);
        mothersnamesList.addAll(other.mothersnamesList);
        return this;
    }
}

您可以将其用作:

personList.stream().collect(
        AggregatedPersonDetails::new,
        AggregatedPersonDetails::add,
        AggregatedPersonDetails::merge);

这只允许进行一次迭代。

如果需要在多个位置执行此操作,可以从中提取可重用的收集器

Collector<Person, AggregatedPersonDetails, AggregatedPersonDetails> collector =
        Collector.of(AggregatedPersonDetails::new, AggregatedPersonDetails::add, AggregatedPersonDetails::merge);

(否则您可以更改并合并()方法返回无效

晋鹤轩
2023-03-14

只需使用循环:

// Allocate correct size to avoid resizing
List<String> names = new ArrayList<>(persons.size());
List<String> surnames = new ArrayList<>(persons.size());
List<String> ages = new ArrayList<>(persons.size());
// etc

for (Person person : persons) {
    names.add(person.getName);
    surnames.add(person.getSurname);
    ages.add(person.getAge);
    // etc
}

这将在很大程度上优于使用流,并且易于阅读和理解。

柳涵映
2023-03-14

复制同样的逻辑不是一种选择。

为此,最好创建一个通用方法,该方法采用两个参数:源列表和函数:

    public static void main(String[] args) {
        List<Integer> ageList = getListOfAttributes(personList, Person::getAge);
        List<String> surnamesList = getListOfAttributes(personList, Person::getSurName);
    }
    public static <T, R> List<R> getListOfAttributes(List<T> source,
                                                     Function<T, R> func) {
        return source.stream()
                .map(func)
                .collect(Collectors.toList());
    }
 类似资料:
  • 问题内容: 当存在时,是否有可能获得全部列表?是否为此准备了电话,还是我必须编写一个foreach循环,如: 问题答案: Java 8及更高版本: 如果需要确保得到结果,则必须将最后一行更改为: Java 7及以下版本: Java 8之前的标准集合API不支持这种转换。您必须编写一个循环(或将其包装在您自己的“地图”函数中),除非您使用一些更高级的集合API /扩展。 (您的Java代码段中的行正

  • 我以前问过这个问题,但现在我试图获得XQuery计算的序列化属性,而不是XSLT转换。 使用此代码: 原始问题答案中提出的方法似乎不适用于这里,因为我无法从XQueryEvaluator实例化序列化程序,而getDeclaredSerializationProperties只能在XSLT上下文中使用。 我用的是萨克森10他。

  • 本文向大家介绍JavaScript获取表单enctype属性的方法,包括了JavaScript获取表单enctype属性的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript获取表单enctype属性的方法。分享给大家供大家参考。具体如下: 运行结果如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我的查询对象是 但是 <代码>列表 将结果列表转换为classNameList。当我迭代单个值时,我的实体值在ClassName属性中为空。调用getter方法时不显示值。我的pojo看起来如下所示,当我打印pojo的值为空时,我的foreach正好迭代四次。 我的查询对象来自com.google.cloud.firestore包。和ApiFuture来自com.google.api.core.A

  • 这不只是为每个属性做一堆if/else if用例吗?

  • 我有以下XSL样式表: 我正在使用Saxon 9.9对其进行如下转换。 我希望返回值是样式表中指定的“UTF-8”,但它返回null。(序列化程序实例似乎根本没有属性。)这是为什么?获取输出属性的正确方法是什么?