Java 如何使用可选列表中的每个元素?
我有一个可以为空的列表Java 如何使用可选列表中的每个元素?,java,lambda,java-stream,Java,Lambda,Java Stream,我有一个可以为空的列表 List<T> list; // may or may not null 或 有什么简单或简洁的方法可以做到这一点吗?我不确定你是否能让它更简洁。但是,如果您经常使用在可为空的列表上循环并使用每个元素的构造,那么您可以创建一个小类,该类只执行以下操作: public class ListConsumer { public static <H> Consumer<List<H>> of(Consumer<H&g
List<T> list; // may or may not null
或
有什么简单或简洁的方法可以做到这一点吗?我不确定你是否能让它更简洁。但是,如果您经常使用在可为空的列表上循环并使用每个元素的构造,那么您可以创建一个小类,该类只执行以下操作:
public class ListConsumer {
public static <H> Consumer<List<H>> of(Consumer<H> consumer) {
return hs -> hs.forEach(consumer);
}
}
公共类ListConsumer{
公共静态消费者(消费者){
返回hs->hs.forEach(消费者);
}
}
然后,您可以按如下方式使用列表中的每个元素(例如,打印列表中的所有字符串):
List List=Arrays.asList(“A”、“B”、“C”);
Consumer=System.out::println;
可选.of nullable(list).ifPresent(ListConsumer.of(consumer));
从技术上讲,如果(list!=null){list.stream().forEach(e->{…});}
在CPU/内存使用方面比您的变体更短、更高效
在体系结构上,如果您可以控制
列表的初始化及其使用,通常最好使用Collections.emptyList()
而不是null
(如果程序的逻辑允许),或者从一开始就将列表设置为可选。这将使您无需每次使用列表时都进行检查或创建可选的。要避免难看的空检查,请使用orElse(Collections.emptyList())
对于静态导入,它非常简洁:
ofNullable(eventDataList).orElse(emptyList()).forEach(e -> {});
如果您需要对列表中的每个值执行某些操作,并说返回一个值,则ifPresent
将不起作用。相反,你可以做下面这样的事情。在我的示例中,可选列表包含一个用户定义的对象Person
,它有几个属性。我在列表上迭代,连接特定属性的值并返回它
public static class Person
{
String name;
int age;
public Person(final String name, final int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
publicstaticvoidmain(字符串[]args)
{
人员a=新人员(“Alice”,1);
人员b=新人员(“Bob”,2);
List personList=Lists.newArrayList(a,b);
字符串concatNames=Optional.of(personList).map(people->people.stream().map(Person::getName).collector(Collectors.joining(“”)).orElse(null);
System.out.println(“名称:“+concatNames”);
}
为什么不干脆if(list!=null){list.foreach(e->{});}?
函数式编程风格很酷,但不一定总是更干净、更可读。@AdrianShum,因为我已经知道了这一点。谢谢。我喜欢CPU/MEM的问题+1我知道这个答案是在2016年Java 9之前给出的,所以现在,可以使用原生of()来处理它,这将创建一个不可变列表。我认为允许通过添加元素来修改不可变列表不是一个好的做法。
List<String> list = Arrays.asList("A", "B", "C");
Consumer<String> consumer = System.out::println;
Optional.ofNullable(list).ifPresent(ListConsumer.of(consumer));
Optional.ofNullable(eventDataList)
.orElse(Collections.emptyList())
.forEach(e -> {});
ofNullable(eventDataList).orElse(emptyList()).forEach(e -> {});
public static class Person
{
String name;
int age;
public Person(final String name, final int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public static void main(String[] args)
{
Person a = new Person("Alice", 1);
Person b = new Person("Bob", 2);
List<Person> personList = Lists.newArrayList(a, b);
String concatNames = Optional.of(personList).map(people -> people.stream().map(Person::getName).collect(Collectors.joining(" "))).orElse(null);
System.out.println("Names: "+concatNames);
}