内側のループが条件を満たす場合、最終的なリストを作成するためにループする2つのリストがあります。
private List<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) {
List<Enum> enumList = new ArrayList<>();
for (Bean.Var var : vars) {
String typeWithoutTypeIdentifierPrefix = var.getType().substring(1,var.getType().length());
for (Enum enumVal : enums) {
if (typeWithoutTypeIdentifierPrefix.equals(enumVal.getName())) {
if (!enumList.contains(enumVal)) {
enumList.add(enumVal);
}
}
}
}
return enumList;
}
最新のJava8ストリーミングAPIを使用するようにコードをリファクタリングし、次のことを思いつきました。
vars.stream().forEach(
var -> {
String typeWithoutPrimitiveIdentifier = var.getType().substring(1,var.getType().length());
enums.stream()
.filter(enumVal -> typeWithoutPrimitiveIdentifier(enumVal.getName()))
.forEach(enumVal -> {
if (!enumList.contains(enumVal)) {
enumList.add(enumVal);
}
});
}
);
これをさらに一歩進めて、ネストされたforeach()メソッドを削除するにはどうすればよいですか?
内部stream().forEach(..)
への呼び出しで使用する場合の問題(外部インスタンスを変更するため)は、誰かがストリームを並列に切り替え、コレクションがスレッドセーフでない場合、同時実行の問題が発生しやすいことです。add
forEach
enumList
代わりに、変更可能な削減に適した収集アプローチを優先する必要があります。
private Set<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) {
return vars.stream()
.map(var -> var.getType().substring(1))
.map(v -> enums.stream().filter(e -> v.equals(e.getName())).findAny())
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toSet());
}
String -> Enum
複数のフィルタリングを回避するために、事前にマッピングを作成することもできます。
private Set<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) {
Map<String, Enum> enumsName = enums.stream().collect(toMap(Enum::getName, e -> e, (e1, e2) -> e1));
return vars.stream()
.map(var -> var.getType().substring(1))
.map(enumsName::get)
.filter(Objects::nonNull)
.collect(toSet());
}
本当にを返したい場合はList
、を見ることができますCollectors.collectingAndThen
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加