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;
_
どうすればもっとエレガントにできますか?
独自の述語を書くことができます:
final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
= e -> e.getValue() != null && !e.getValue().isEmpty();
次に、valueNotNullOrEmpty
をフィルター引数として使用します。
Commons-lang3を使用する場合、StringUtilsは
isEmpty()
isNotEmpty()
isBlank()
isNotBlank()
これらのメソッドは、フィルターでメソッド参照として使用できます。
this.stringList.stream().filter(StringUtils::isNotBlank);
またはラムダとして:
this.stringList.stream().filter(s -> StringUtils.isNotBlank(s));
独自の述語を使用して、独自のStrings
クラスを作成できます。
public class Strings {
public static boolean isNotNullOrEmpty (String str) {
return str != null && !str.isEmpty();
}
}
次に、コードで:
.filter(Strings::isNotNullOrEmpty)
しかし、@ fgeが言及したように、Map.Entry<?,?>
でそれを使用することはできません...
フィルターは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)));
_
それは私のために働く:list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());
Java 11に新しいメソッドがあります Predicate :: not 。
したがって、空の文字列を除外できます:
list.stream()
.filter(Objects::nonNull)
.filter(Predicate.not(String::isEmpty))