试图理解Java 8中的lambda和stream
发布时间:2020-12-14 05:50:36 所属栏目:Java 来源:网络整理
导读:我试图在 Java 8中理解Lambdas. 假设我有一个如下所示的Person类: public class Person implements { String name; GenderEnum gender; int age; ListPerson children;} 现在我要做的是找到所有女性,有10岁以下孩子的人. 前java 8我会这样做: ListPerson a
我试图在
Java 8中理解Lambdas.
假设我有一个如下所示的Person类: public class Person implements { String name; GenderEnum gender; int age; List<Person> children; } 现在我要做的是找到所有女性,有10岁以下孩子的人. 前java 8我会这样做: List<Person> allPersons = somePeople(); List<Person> allFemaleWithChildren = new ArrayList<>(); for(Person p : allPersons) { for(Person child : p.getChildren()) { if(child.getAge() < 10 && p.getGender() == GenderEnum.Female) { allFemaleWithChildren.add(p); } } } 现在allFemaleWithChildren应该拥有我想要的东西. allPersons.stream() //filter females .filter(p -> p.getGender == GenderEnum.Female) //get the children .map(c -> c.getChildren()) //filter the ones that are less than 10 years .filter(c -> c.getAge() < 10) //return a list with the result .collect(Collectors.toList()) 但是这段代码没有编译. 另外,我不明白reduce方法可以用于什么. 编译说 解决方法
此刻(一旦你修复了编译错误),你将返回一个Children列表.假设在您的原始代码中,一旦您找到10岁以下的孩子,您打算打破,相当于:
allPersons.stream() //filter females .filter(p -> p.getGender() == GenderEnum.Female) //only keep females with at least one child < 10 .filter(f -> f.getChildren().stream() .anyMatch(c -> c.getAge() < 10)) //return a list with the result .collect(Collectors.toList()) 确实如下所述,您可以使用一些静态导入,添加辅助方法并重构原始代码以使其更具可读性: allPersons.stream() .filter(this::female) .filter(this::hasChildrenUnder10) .collect(toList()) //... private boolean female(Person p) { return p.getGender() == Female; } private boolean hasChildrenUnder10(Person parent) { return parent.getChildren().stream() .anyMatch(c -> c.getAge() < 10)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |