Java - 使用条件和 Lambda 在数组中查找元素
Posted
技术标签:
【中文标题】Java - 使用条件和 Lambda 在数组中查找元素【英文标题】:Java - Find Element in Array using Condition and Lambda 【发布时间】:2015-11-22 14:01:49 【问题描述】:简而言之,我有这段代码,我想使用条件和 lambda 获取数组的特定元素。代码是这样的:
Preset[] presets = presetDALC.getList();
Preset preset = Arrays.stream(presets).select(x -> x.getName().equals("MyString"));
但这显然行不通。在 C# 中会类似,但在 Java 中,我该怎么做?
【问题讨论】:
【参考方案1】:你可以这样做,
Optional<Preset> optional = Arrays.stream(presets)
.filter(x -> "MyString".equals(x.getName()))
.findFirst();
if(optional.isPresent()) //Check whether optional has element you are looking for
Preset p = optional.get();//get it from optional
你可以阅读更多关于Optional
here的信息。
【讨论】:
不鼓励使用isPresent()
和 .get()
,因为它会破坏使用 optional 的目的。
不是直接的。使用 Optional 的主要原因是强制检查(尽可能早地触发错误)。如果您可以证明它成立,那么使用 get() 是可以的,他确实这样做了。我同意,一般来说使用替代品会更好。但是在很多情况下,你不能直接命名一个默认值或者想抛出一个异常,而是你可能希望在isPresent()
的if-else
中进行错误处理,然后使用get()
。【参考方案2】:
像这样:
Optional<Preset> preset = Arrays
.stream(presets)
.filter(x -> x.getName().equals("MyString"))
.findFirst();
这将返回一个Optional
,它可能包含也可能不包含值。如果您想完全摆脱Optional
:
Preset preset = Arrays
.stream(presets)
.filter(x -> x.getName().equals("MyString"))
.findFirst()
.orElse(null);
filter()
操作是返回惰性流的中间操作,因此即使遇到匹配项,也无需担心整个数组会被过滤。
【讨论】:
【参考方案3】:你想要第一个匹配,还是全部匹配?
String[] presets = "A", "B", "C", "D", "CA";
// Find all matching
List<String> resultList = Arrays.stream(presets)
.filter(x -> x.startsWith("C"))
.collect(Collectors.toList());
System.out.println(resultList);
// Find first matching
String firstResult = Arrays.stream(presets)
.filter(x -> x.startsWith("C"))
.findFirst()
.orElse(null);
System.out.println(firstResult);
输出
[C, CA]
C
【讨论】:
【参考方案4】:自 Java 8 以来的单线:
Preset found = Stream.of(presets)
.filter(p -> p.getName().equals("MyString"))
.findFirst().orElseThrow();
避免将 findFirst
返回的 Optional 声明为变量或参数。它专为返回类型/“单线”样式而设计。
【讨论】:
是否有一种在缺少元素的情况下不会引发异常的单行程序?例如。你可以把一些东西扔进一个条件中,这样你就可以在需要时添加缺少的元素。 @Fopedush,绝对是:...findFirst().orElse(MY_EMPTY_OBJ);
。见:docs.oracle.com/javase/9/docs/api/java/util/…以上是关于Java - 使用条件和 Lambda 在数组中查找元素的主要内容,如果未能解决你的问题,请参考以下文章
Java 8:带有 where 条件的 Lambda 表达式