如何从列表中存储的对象中获取特定字段值的列表?

use*_*585 26 java collections

假设我有一个包含两个字段的对象列表,field1并且field2都是String类型.

field1如果可能的话,如何获取所有值的列表而不必遍历列表?

Jad*_*ine 31

幸运的是,您可以使用Java 8 - Streams执行此操作

假设您有一个名为YourEntity的实体

public class YourEntity {

    private String field1;
    private String field2;

    public YourEntity(String field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    public String getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下内容声明YourEntity列表:

List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式一次性提取field1的列表:

import java.util.stream.Collectors;

List<String> field1List = entities.stream().map(YourEntity::getField1).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者以这种方式

import java.util.stream.Collectors;

List<String> field1List = entities.stream().map(urEntity -> urEntity.getField1()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

您也可以使用java 8打印所有项目:)

field1List.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

产量

text1
text3
Run Code Online (Sandbox Code Playgroud)


Euc*_*bwè 8

试试这个:

List<Entity> entities = getEntities();
List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.class).getFielf1());
Run Code Online (Sandbox Code Playgroud)

LambdaJ允许访问没有显式循环的集合,因此不要让更多的代码行自己迭代列表,而是让LambdaJ去做.


dou*_*nyy 8

对象是对内存地址的引用。然后,此对象的字段是对其他内存地址的其他引用。因此,对象列表就是引用列表。因此,列表不可能直接访问对象字段(引用给出的引用)。最简洁的答案是不。

注意:无论如何你会找到一个可以做你想做的事情的 API,它仍然在内部循环。


hay*_*lem 5

要看...

...您的问题是否涉及avoiding iterating over the collection

  • 在呼叫点的易于实施方面
  • 或者 在算法复杂度方面

具体来说,你的意思是:

  • 您不想自己输入迭代构造(只需使用便利库),
  • 或者您实际上想要一些可以在 O(1) 中自动返回元素而无需处理它们(并具有完美访问权限)的东西?

有关解决方案和选项,请参见下文。


使用便利库

如果是第一个,那么看看谷歌 Guava、LambdaJ、FunctionalJava 或其他实现基本功能结构的库,并允许您在几个富有表现力的调用中做您想做的事。但是请记住,它们会按照罐头上的说明执行操作:它们将过滤、收集或转换一个集合,并遍历其元素来执行此操作。

例如:


完美访问

如果是第二个,这是不可能的除非您从一开始就构建了所有内容,以便您的对象应该由自定义集合类管理,该类将根据对象在插入时的字段值索引您的对象

它会将它们保存在由所述值索引的存储桶中,以便您随时可以将它们作为列表或按需设置进行检索。

正如 dounyy 回答下面的评论中所提到的,设计这样一个自定义集合可能会对它接受的元素的 API 产生影响(很可能通过定义一个用于元素类型的超级接口),或者需要一个相当复杂的实现动态解析成员(最有可能通过使用反射),如果您希望这个集合是通用的。