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

你可以阅读更多关于Optionalhere的信息。

【讨论】:

不鼓励使用 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 声明为变量或参数。它专为返回类型/“单线”样式而设计。

见javadoc API Note 见26 Reasons Why Using Optional Correctly

【讨论】:

是否有一种在缺少元素的情况下不会引发异常的单行程序?例如。你可以把一些东西扔进一个条件中,这样你就可以在需要时添加缺少的元素。 @Fopedush,绝对是:...findFirst().orElse(MY_EMPTY_OBJ);。见:docs.oracle.com/javase/9/docs/api/java/util/…

以上是关于Java - 使用条件和 Lambda 在数组中查找元素的主要内容,如果未能解决你的问题,请参考以下文章

Java 8:带有 where 条件的 Lambda 表达式

Java Lambda 表达式的官网教程理解

使用 Lambda 的 Java 8 过滤器数组

Lambda 表达式

Java的for循环、增强for循环、lambda表达式中的forEach 三种方式优缺点比较?

java 基本语法(十七)Lambda 构造器引用与数组引用