web-dev-qa-db-ja.com

Java 8 Stream String Null or Empty Filter

Stream内にGoogle Guavaがあります:

_this.map.entrySet().stream()
.filter(entity -> !Strings.isNullOrEmpty(entity.getValue()))
.map(obj -> String.format("%s=%s", obj.getKey(), obj.getValue()))
.collect(Collectors.joining(","))
_

ご覧のように、フィルター関数内にステートメント!String.isNullOrEmpty(entity)があります。

プロジェクトでGuavaを使用したくないので、単に次のように置き換えます。

_string == null || string.length() == 0;
_

どうすればもっとエレガントにできますか?

18
ServerSideCat

独自の述語を書くことができます:

final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
    = e -> e.getValue() != null && !e.getValue().isEmpty();

次に、valueNotNullOrEmptyをフィルター引数として使用します。

18
fge

Commons-lang3を使用する場合、StringUtilsは

  • isEmpty()
  • isNotEmpty()
  • isBlank()
  • isNotBlank()

これらのメソッドは、フィルターでメソッド参照として使用できます。

this.stringList.stream().filter(StringUtils::isNotBlank);

またはラムダとして:

this.stringList.stream().filter(s -> StringUtils.isNotBlank(s));
14
rvertigo

独自の述語を使用して、独自のStringsクラスを作成できます。

public class Strings {
  public static boolean isNotNullOrEmpty (String str) {
    return str != null && !str.isEmpty();
  }
}

次に、コードで:

.filter(Strings::isNotNullOrEmpty)

しかし、@ fgeが言及したように、Map.Entry<?,?>でそれを使用することはできません...

7

フィルターは2つのステップに分割できます。

_this.map.entrySet().stream()
    .filter(entity -> entity.getValue() != null)
    .filter(entity -> !entity.getValue().isEmpty())
    .map(obj -> String.format("%s=%s", obj.getKey(), obj.getValue()))
    .collect(Collectors.joining(","))
_

ちなみに、ほとんどのMap.Entry.toString()実装はmap()で実行していることを正確に実行するため、理論的にはmap(Map.Entry::toString)を実行できます。しかし、toString()またはドキュメント化された動作や決定論的な動作を必要としないものを作成しない限り、これに依存しません。

また、私はあなたがグアバを放棄したいことを知っていますが、ここにあなたが再考するかもしれない解決策があります:

_Joiner.on(',').withKeyValueSeparator("=")
      .join(Maps.filterValues(map, Predicates.not(Strings::isNullOrEmpty)));
_
2
shmosel

それは私のために働く:list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());

0
Taras Melnyk

Java 11に新しいメソッドがあります Predicate :: not

したがって、空の文字列を除外できます:

list.stream()
        .filter(Objects::nonNull)
        .filter(Predicate.not(String::isEmpty))
0
lczapski