web-dev-qa-db-ja.com

Java-条件とラムダを使用して配列内の要素を検索

つまり、このコードがあり、条件とラムダを使用して配列の特定の要素を取得したいと思います。コードは次のようになります。

Preset[] presets = presetDALC.getList();
Preset preset = Arrays.stream(presets).select(x -> x.getName().equals("MyString"));

しかし、明らかにこれは機能しません。 C#では似たようなものになりますが、Javaではどうすればいいですか?

20
Joe Almore

このようにできます

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 の詳細を読むことができます。

36
CoderCroc

このような:

_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()操作は、遅延ストリームを返す中間操作であるため、一致が検出された後でも配列全体がフィルターされることを心配する必要はありません。

21

最初に一致させますか、それともすべて一致させますか?

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
8
Andreas