我以前使用过:
List<Person> person = UserDB.getUserDetails();
Person p = person.get(0); // index of first position
System.out.println(p.getFirstName()); // sometime i am getting
// NULL pointer issue if person object is null
在Java 8中,我尝试使用map(Person::new)
。是造成问题的原因。
person.stream().limit(1).map(Person::new).
如何实施?
答案 0 :(得分:10)
您可以执行以下操作:
person.stream() // stream
.findFirst() // finds the first
.ifPresent(i -> System.out.println(i.getFirstName())); // if present, print the name
如果要在Person
为空的情况下使用List<Person>
,请使用Optional
:
Optional<Person> p = person.stream().findFirst();
p.ifPresent(i -> System.out.println(i.getFirstName()));
此解决方案假定列表中是否包含元素(为空)。但是,如果null
中出现List<Person>
,则必须先过滤掉null
值:
Optional<Person> p = person.stream().filter(Objects::nonNull).findFirst();
p.ifPresent(i -> System.out.println(i.getFirstName()));
最后,如果您希望使用特定索引上的Person
,请使用skip
和limit
。不要忘记过滤List<Person>
之后的 skip-limit`否则索引将不匹配:
// person.get(3)
Optional<Person> p = person.stream().skip(3).limit(1).filter(Objects::nonNull).findFirst();
p.ifPresent(i -> System.out.println(i.getName()));
答案 1 :(得分:3)
Optional<Person> firstName =
person.stream()
.limit(1)
.filter(Objects::notNull)
.findFirst();
如果您的第一个元素为null,则最好返回Optional<Person>
,从而迫使任何使用此元素的人采取适当的措施。
或更简单:
Optional<Person> first = Optional.ofNullable(person.get(0));
答案 2 :(得分:0)
这怎么办,它也会处理空情况;
System.out.println(Optional
.ofNullable(UserDB.getUserDetails())
.orElse(Collections.emptyList())
.stream()
.map(Person::getName)
.findFirst()
.orElse(null));