Java 8流更简单

4

我有一些对象的列表。这些对象有一些字段和其他随时间变化的内容。我想获取列表中某些元素,这些元素具有等于true的某些值。然后我想将该对象用在其他地方。

当列表中不包含具有该元素的对象时,我会得到一个异常并且我的应用程序会崩溃。所以我正在使用一段非常奇怪的代码来避免这种情况,我想知道是否有比这更简单和更好的方法。

public class CustomObject{
    private String name;
    private boolean booleanValue;
    //Getters and setters... 
}

//Somewhere else I have the list of objects.
List<CustomObject> customList = new ArrayList<>();
//Now... here I am using this strange piece of code I want to know how to change.
if (customList.stream().filter(CustomObject::getBooleanValue).findAny().isPresent()) {
    customList.stream().filter(CustomObject::getBooleanValue).findAny().get().... //some custom stuff here.
}

正如您所看到的,我在这里写了一些非常丑陋的代码:重复调用同一个方法。我尝试了一些类似于

的方法:

CustomObject customObject = customList.stream().filter..... 

我希望检查对象不为空,但它并没有按照我的期望执行。


1
为什么不直接将Optional存储在变量中呢? - Sotirios Delimanolis
因为我不想使用可选项。 - Jan Doomwalkerx Peřina
什么?为什么?你已经在使用它了。 - Sotirios Delimanolis
StreambooleanValuetrue 的对象是否只有一个? - Paul Boddington
2
你不应该无条件地调用get()方法;你应该使用其中一个安全的方法,如orElse、orElseThrow或ifPresent。 - Brian Goetz
1个回答

8

如果条件成立,您可以使用ifPresent来消除isPresentget

customList.stream()
          .filter(CustomObject::getBooleanValue)
          .findAny()
          .ifPresent(customObject -> { /* do something here */ });

如果findAny()找到了一个值,那么指定的操作将会被执行;否则将不会发生任何事情。

谢谢,这正是我正在寻找的! - Jan Doomwalkerx Peřina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接