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)
试试这个:
List<Entity> entities = getEntities();
List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.class).getFielf1());
Run Code Online (Sandbox Code Playgroud)
LambdaJ允许访问没有显式循环的集合,因此不要让更多的代码行自己迭代列表,而是让LambdaJ去做.
对象是对内存地址的引用。然后,此对象的字段是对其他内存地址的其他引用。因此,对象列表就是引用列表。因此,列表不可能直接访问对象字段(引用给出的引用)。最简洁的答案是不。
注意:无论如何你会找到一个可以做你想做的事情的 API,它仍然在内部循环。
...您的问题是否涉及avoiding iterating over the collection:
具体来说,你的意思是:
有关解决方案和选项,请参见下文。
如果是第一个,那么看看谷歌 Guava、LambdaJ、FunctionalJava 或其他实现基本功能结构的库,并允许您在几个富有表现力的调用中做您想做的事。但是请记住,它们会按照罐头上的说明执行操作:它们将过滤、收集或转换一个集合,并遍历其元素来执行此操作。
例如:
Set<String> strings = buildSetStrings();
Collection<String> filteredStrings =
Collections2.filter(strings, Predicates.containsPattern("^J"));
Run Code Online (Sandbox Code Playgroud)Array<Integer> a = array(97, 44, 67, 3, 22, 90, 1, 77, 98, 1078, 6, 64, 6, 79, 42);
Array<Integer> b = a.filter(even);
Run Code Online (Sandbox Code Playgroud)拉姆达:
List<Integer> biggerThan3 = filter(greaterThan(3), asList(1, 2, 3, 4, 5));
Run Code Online (Sandbox Code Playgroud)如果是第二个,这是不可能的,除非您从一开始就构建了所有内容,以便您的对象应该由自定义集合类管理,该类将根据对象在插入时的字段值索引您的对象。
它会将它们保存在由所述值索引的存储桶中,以便您随时可以将它们作为列表或按需设置进行检索。
正如 dounyy 回答下面的评论中所提到的,设计这样一个自定义集合可能会对它接受的元素的 API 产生影响(很可能通过定义一个用于元素类型的超级接口),或者需要一个相当复杂的实现动态解析成员(最有可能通过使用反射),如果您希望这个集合是通用的。