Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用可选列表中的每个元素?_Java_Lambda_Java Stream - Fatal编程技术网

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);
    }