这里是Java 11。下面是POJO:
@Data // Lombok; adds getters, setters, all-args constructor and equals and hashCode
public class Fliflam {
private String merf;
private String tarf;
private Boolean isFlerf;
}我有一个验证Flimflam的方法,并返回在验证Flimflam时遇到的任何错误的List<String>。如果出于某些原因,我可以将其更改为返回Optional<List<String>>,特别是在处理Stream时:
public List<String> validateFlimflam(Flimflam flimflam) {
List<String> errors = new ArrayList<>();
// ... validation code omitted for brevity
// 'errors' list is populated with any errors; otherwise it returns empty
return errors;
}我希望流(Stream )通过一个List<Flimflam>并填充一个Map<Flimflam,List<String>>错误映射,其中映射的键是一个验证失败的Flimflam,它的相应值是验证错误字符串的列表。
我可以用这样的“老式”方式来实现这一目标:
List<Flimflam> flimflams = getSomehow();
Map<Flimflam,List<String>> errorsMap = new HashMap<>();
for (Flimflam ff : flimflams) {
List<String> errors = validateFlimflam(ff);
if (!errors.isEmpty() {
errorsMap.put(ff, errors);
}
}如何通过Stream实现这一点?
发布于 2021-12-08 16:18:13
像这样
Map<Flimflam,List<String>> errorsMap = flimflams.stream().collect(Collectors.toMap(f -> f, f-> f::validateFlimflam));toMap接受2个参数(keyMapper,valueMapper),在您的示例中,密钥映射程序是来自流本身的对象,而值是在该对象上调用validateFlimflam。
发布于 2021-12-08 17:20:04
很难说您的validateFlimflam方法是在哪里定义的。我怀疑它不在Flimflam类本身中,因为不需要将其自身的一个实例传递给该方法。所以我认为它是那个类的一个外部方法。假设我将按以下方式进行:
thisClass =包含validateFlimflam的实例。可以设置为this
Map<Flimflam, List<String>> errorsMap =
flimflams.stream().collect(Collectors.toMap(f -> f,
thisClass::validateFlimflam));如果偶然地,Flimflam确实包含了validateFlimflam,那么您可以这样做。请注意,这假定该方法不使用参数,因为它们不是必要的
Map<Flimflam, List<String>> errorsMap =
flimflams.stream().collect(Collectors.toMap(f -> f,
Flimflam::validateFlimflam));最后,如果包含类是其他类,并且validateFlimflam方法声明为静态的,那么您可以这样做,方法是使用包含的类名而不是实例。而且,在这种情况下,该方法将接受定义的参数。
Map<Flimflam, List<String>> errorsMap =
flimflams.stream().collect(Collectors.toMap(f -> f,
SomeClass::validateFlimflam));https://stackoverflow.com/questions/70278160
复制相似问题