終端操作 - Java 8ストリーム文字列空または空フィルタ



java stream tolist (4)

私は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;

もっとエレガントにするにはどうすればいいですか?

https://src-bin.com


Answer #1

commons-lang3を使いたい場合は、StringUtilsに

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

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

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

またはラムダとして:

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

Answer #2

あなた自身の述語を書くことができます:

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

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


Answer #3

フィルタを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)だけを実行できmap(Map.Entry::toString) 。 しかし、 toString()や、文書化された動作や確定的な動作を必要としないものを作っていない限り、私はそれに頼っていません。

また、あなたがGuavaを放棄することを知っていますが、ここで再考できる解決策があります:

Joiner.on(',').withKeyValueSeparator("=")
      .join(Maps.filterValues(map, Predicates.not(Strings::isNullOrEmpty)));

Answer #4

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

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

次に、あなたのコードで:

.filter(Strings::isNotNullOrEmpty)

しかし、@ fgeが述べたように、あなたはMap.Entry<?,?>それを使うことはできません。





java-stream