现在已经使用Java 8超过6个月左右,我对新的API更改感到非常满意.我仍然不自信的一个领域是什么时候使用Optional
.我似乎想要在任何可能的null
地方使用它,而且无处可去.
似乎有很多情况我可以使用它,我不知道它是否增加了好处(可读性/无效安全性)或只是导致额外的开销.
所以,我有一些例子,我对社区是否Optional
有益的想法感兴趣.
1 - 当方法可以返回时作为公共方法返回类型null
:
public Optional<Foo> findFoo(String id);
Run Code Online (Sandbox Code Playgroud)
2 - 当参数可能是null
以下时作为方法参数:
public Foo doSomething(String id, Optional<Bar> barOptional);
Run Code Online (Sandbox Code Playgroud)
3 - 作为bean的可选成员:
public class Book {
private List<Pages> pages;
private Optional<Index> index;
}
Run Code Online (Sandbox Code Playgroud)
4 - 在Collections
:
一般来说,我不认为:
List<Optional<Foo>>
Run Code Online (Sandbox Code Playgroud)
添加任何东西 - 特别是因为可以使用filter()
删除null
值等,但是Optional
在集合中是否有任何好的用途?
我错过了什么案例?
我怎样才能优雅地序列化lambda?
例如,下面的代码抛出一个NotSerializableException
.如何在不创建SerializableRunnable
"虚拟"界面的情况下修复它?
public static void main(String[] args) throws Exception {
File file = Files.createTempFile("lambda", "ser").toFile();
try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
Runnable r = () -> System.out.println("Can I be serialized?");
oo.writeObject(r);
}
try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
Runnable r = (Runnable) oi.readObject();
r.run();
}
}
Run Code Online (Sandbox Code Playgroud) 我已经阅读了Optional
Java 8中的目的(遗憾的是我不记得在哪里),我很惊讶作者没有提到在类中使用an Optional
作为属性.
由于我在课堂上经常使用选项,我想知道这是不是很好.或者我可以更好地使用普通属性,null
它们在未设置时返回?
注意:看起来我的问题可能是基于意见的,但我觉得Optional
在课堂上使用的感觉真的不是要走的路(看完上面提到的帖子后).但是,我喜欢使用它,并且找不到使用它的任何缺点.
例
我想举一个例子来澄清.我有一个类Transaction
,它是这样构建的:
public class Transaction {
private Optional<Customer> = Optional.empty();
....
Run Code Online (Sandbox Code Playgroud)
VS
public class Transaction {
private Customer = null;
....
Run Code Online (Sandbox Code Playgroud)
当在一个检查Customer
,我认为这是最合理的使用transaction.getCustomer().isPresent()
比transaction.getCustomer() != null
.在我看来,第一个代码比第二个代码更清晰.
我有一个实例 OptionalLong
.但我的一个库需要Optional<Long>
一个参数.
我怎样才能将我OptionalLong
变成一个Optional<Long>
?
我梦想着这样的事情:
OptionalLong secondScreenHeight = OptionalLong.of(32l); // or: OptionalLong.empty()
api.setHeight(secondScreenHeight.maptoRegularOptional()); // .maptoUsualOptional does not exist
Run Code Online (Sandbox Code Playgroud) Java 8 中引入的类型Optional<T>
主要推荐用于返回类型和结果。因此,每当我在类字段或方法参数中使用它时,我都会在 IntelliJ 中收到警告:
Optional<?>
用作字段/参数的类型。
Optional<T>
但是,当我在规范构造函数中使用 an 作为记录参数时,我没有收到此警告:
public record AuthenticationResult(
boolean isAuthenticated,
Optional<User> user,
Optional<String> authorizationHeader)
{ }
Run Code Online (Sandbox Code Playgroud)
不使用类型作为参数/字段的做法是否Optional<T>
不适用于记录参数,因为字段将始终作为记录自动生成的 getter 方法的返回值进行访问?
或者是因为记录是一项新功能,并且此警告尚未实现,并且在记录中使用可选参数与用作方法参数或字段时具有相同的后果?
当使用Optional<T>
可空字段时,使用setter更加惯用
Optional<T>
T
然后得到如下?public class Bar {
private Optional<T> foo;
public void setFoo(T foo) {
this.foo = Optional.<T>fromNullable(foo);
}
public Optional<T> getFoo() {
return foo;
}
}
Run Code Online (Sandbox Code Playgroud) 哪种空检更好?
Optional.ofNullable(port).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)
要么
if (port != null) {
settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud) 我是新手,在java 8流+ lambda中努力学习.有人可以用下面的代码帮助我吗?需要从列表中找到第一人的年龄是可选的.此列表可以为null.
缺少代码 - null检查列表的第一个元素.想要检查一下.
相当于下面一段代码的东西.
//input parameter
//Optional<List<Person>> persons
public Integer getAgeOfFirstPerson(Optional<List<Person>> persons) {
if (!persons.isPresent()) {
return null;
}
Integer age = persons.get()
.get(0)
.getAge();
return age;
}
//Person.java
class Person {
Integer age;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud) java ×7
java-8 ×6
optional ×5
lambda ×3
guava ×1
java-17 ×1
java-stream ×1
null ×1
option-type ×1
record ×1