Java 8 Java 8多谓词摘要

Java 8 Java 8多谓词摘要,java-8,java-stream,Java 8,Java Stream,考虑以下使用注释注释的pojo类 @Setter @Getter @Builder @ToString public class User { private String firstName; private String lastName; private Gender gender; private Integer age; private Integer points; } 要求获取以下谓词的“points”属性的LongSummaryStati

考虑以下使用注释注释的pojo类

@Setter
@Getter
@Builder
@ToString
public class User {
    private String firstName;
    private String lastName;
    private Gender gender;
    private Integer age;
    private Integer points;
}
要求获取以下谓词的“points”属性的
LongSummaryStatistics

  • Predicate adultMenPredicate=user->Gender.MALE==user.getGender&&user.getAge()>18
  • Predicate adultWomenPredicate=user->Gender.FEMALE==user.getGender&&user.getAge()>18

  • Predicate minorPredicate=user->user.getAge()

    public static void main(String [] args) {
        List<User> users = ImmutableList.of(new User("a", "s", MALE, 19, 22),
                                            new User("a", "s", MALE, 15, 49),
                                            new User("a", "s", MALE, 22, 11),
                                            new User("a", "s", FEMALE, 19, 1),
                                            new User("a", "s", MALE, 12, 22));
    
        Map<Type, Integer> collect = users.stream()
                .map(u -> Tuple.tuple(u, resolveType(u)))
                .collect(Collectors.groupingBy(Tuple::right, Collectors.summingInt(t -> t.left().points)));
        System.out.println(collect);
    }
    
    public static Type resolveType(final User user) {
        if (user.gender == MALE && user.age > 18) {
            return Type.ADULT_MALE;
        } else if (user.gender == FEMALE && user.age > 18) {
            return Type.ADULT_FEMALE;
        } else {
            return Type.MINOR;
        }
    }
    
    public enum Type {
        ADULT_MALE, ADULT_FEMALE, MINOR
    }
    
    @ToString
    @EqualsAndHashCode
    public class Tuple<L, R> {
        public static <L, R> Tuple<L, R> tuple(L left, R right) {
            return new Tuple<>(left, right);
        }
    
        private final L left;
        private final R right;
    
        private Tuple(L left, R right) {
            this.left = left;
            this.right = right;
        }
    
        public L left() {
            return left;
        }
    
        public R right() {
            return right;
        }
    }
    
    我想你不必担心性能,除非你要处理大量的收藏

    //编辑 我只是想说清楚。我的元组实现如下所示:

    public static void main(String [] args) {
        List<User> users = ImmutableList.of(new User("a", "s", MALE, 19, 22),
                                            new User("a", "s", MALE, 15, 49),
                                            new User("a", "s", MALE, 22, 11),
                                            new User("a", "s", FEMALE, 19, 1),
                                            new User("a", "s", MALE, 12, 22));
    
        Map<Type, Integer> collect = users.stream()
                .map(u -> Tuple.tuple(u, resolveType(u)))
                .collect(Collectors.groupingBy(Tuple::right, Collectors.summingInt(t -> t.left().points)));
        System.out.println(collect);
    }
    
    public static Type resolveType(final User user) {
        if (user.gender == MALE && user.age > 18) {
            return Type.ADULT_MALE;
        } else if (user.gender == FEMALE && user.age > 18) {
            return Type.ADULT_FEMALE;
        } else {
            return Type.MINOR;
        }
    }
    
    public enum Type {
        ADULT_MALE, ADULT_FEMALE, MINOR
    }
    
    @ToString
    @EqualsAndHashCode
    public class Tuple<L, R> {
        public static <L, R> Tuple<L, R> tuple(L left, R right) {
            return new Tuple<>(left, right);
        }
    
        private final L left;
        private final R right;
    
        private Tuple(L left, R right) {
            this.left = left;
            this.right = right;
        }
    
        public L left() {
            return left;
        }
    
        public R right() {
            return right;
        }
    }
    
    @ToString
    @EqualsAndHashCode
    公共类元组{
    公共静态元组(左,右){
    返回新元组(左、右);
    }
    二等兵,我走了;
    私权;
    私有元组(左左,右){
    this.left=左;
    这个。右=右;
    }
    公共左{
    左转;
    }
    公权{
    返还权;
    }
    }
    
    我想出了这样的办法:

    public static void main(String [] args) {
        List<User> users = ImmutableList.of(new User("a", "s", MALE, 19, 22),
                                            new User("a", "s", MALE, 15, 49),
                                            new User("a", "s", MALE, 22, 11),
                                            new User("a", "s", FEMALE, 19, 1),
                                            new User("a", "s", MALE, 12, 22));
    
        Map<Type, Integer> collect = users.stream()
                .map(u -> Tuple.tuple(u, resolveType(u)))
                .collect(Collectors.groupingBy(Tuple::right, Collectors.summingInt(t -> t.left().points)));
        System.out.println(collect);
    }
    
    public static Type resolveType(final User user) {
        if (user.gender == MALE && user.age > 18) {
            return Type.ADULT_MALE;
        } else if (user.gender == FEMALE && user.age > 18) {
            return Type.ADULT_FEMALE;
        } else {
            return Type.MINOR;
        }
    }
    
    public enum Type {
        ADULT_MALE, ADULT_FEMALE, MINOR
    }
    
    @ToString
    @EqualsAndHashCode
    public class Tuple<L, R> {
        public static <L, R> Tuple<L, R> tuple(L left, R right) {
            return new Tuple<>(left, right);
        }
    
        private final L left;
        private final R right;
    
        private Tuple(L left, R right) {
            this.left = left;
            this.right = right;
        }
    
        public L left() {
            return left;
        }
    
        public R right() {
            return right;
        }
    }
    
    我想你不必担心性能,除非你要处理大量的收藏

    //编辑 我只是想说清楚。我的元组实现如下所示:

    public static void main(String [] args) {
        List<User> users = ImmutableList.of(new User("a", "s", MALE, 19, 22),
                                            new User("a", "s", MALE, 15, 49),
                                            new User("a", "s", MALE, 22, 11),
                                            new User("a", "s", FEMALE, 19, 1),
                                            new User("a", "s", MALE, 12, 22));
    
        Map<Type, Integer> collect = users.stream()
                .map(u -> Tuple.tuple(u, resolveType(u)))
                .collect(Collectors.groupingBy(Tuple::right, Collectors.summingInt(t -> t.left().points)));
        System.out.println(collect);
    }
    
    public static Type resolveType(final User user) {
        if (user.gender == MALE && user.age > 18) {
            return Type.ADULT_MALE;
        } else if (user.gender == FEMALE && user.age > 18) {
            return Type.ADULT_FEMALE;
        } else {
            return Type.MINOR;
        }
    }
    
    public enum Type {
        ADULT_MALE, ADULT_FEMALE, MINOR
    }
    
    @ToString
    @EqualsAndHashCode
    public class Tuple<L, R> {
        public static <L, R> Tuple<L, R> tuple(L left, R right) {
            return new Tuple<>(left, right);
        }
    
        private final L left;
        private final R right;
    
        private Tuple(L left, R right) {
            this.left = left;
            this.right = right;
        }
    
        public L left() {
            return left;
        }
    
        public R right() {
            return right;
        }
    }
    
    @ToString
    @EqualsAndHashCode
    公共类元组{
    公共静态元组(左,右){
    返回新元组(左、右);
    }
    二等兵,我走了;
    私权;
    私有元组(左左,右){
    this.left=左;
    这个。右=右;
    }
    公共左{
    左转;
    }
    公权{
    返还权;
    }
    }
    
    不适用于流。从计算的角度来看,在列表上迭代三次的操作是常量,因此忽略性能问题。保持原样,更具可读性和可测试性。如果你真的(真的)需要性能,那么通过构建你自己的统计数据和流中的If-then-else-for-eachNot-for-eachNot-for-streams来为每一个构建一个for-each。从计算的角度来看,在列表上迭代三次的操作是常量,因此忽略性能问题。保持原样,更具可读性和可测试性。如果你真的(真的)需要表现,通过构建您自己的统计数据,然后在for each中使用a for each,然后在for each中使用else,我们如何获得最小最大平均值等,这是
    LongSummary统计数据的属性
    ?但我认为我们可以使用groupingBy,而不是这里提到的元组:我已经使用了groupingBy收集器,但我在元组的左侧字段进行分组。这里使用元组是因为我需要访问用户和解析类型。我使用summingit嵌套收集器获得点的总和。让我们来看看这个课程。有许多收集器可能对您有所帮助,如:Averagint、minBy、maxBy等。
    元组
    类型与强制执行其必要性的
    .map
    步骤一样过时。只需使用
    users.stream().collect(Collectors.groupingBy(u->resolveType(u),Collectors.summingit(User::getPoints))
    (或
    users.stream().collector(Collectors.groupingBy(u->resolveType(u),Collectors.summaringlong(User::getPoints))
    即可获得
    长摘要统计数据。除此之外,我不会在
    resolveType
    中使用流,而只是
    返回user.getAge()<18?Type.MINOR:user.getGender()==男性?成年型男性:成年型女性注意,检查
    =18
    两次…@Holger:是的,你是对的。我刚刚习惯了使用元组(scala)。在这种情况下,Tuple+map是不必要的,但当您使用Tuple时,它会使代码更具可读性(至少对我来说)。检查如何获得min-max average etc,这是
    Longsummary Statistics
    的属性?但我认为我们可以使用groupingBy而不是这里提到的元组:我已经使用groupingBy collector,但我使用元组的左字段分组。这里使用元组是因为我需要访问用户和解析类型。我使用summingit嵌套收集器获得点的总和。让我们来看看这个课程。有许多收集器可能对您有所帮助,如:Averagint、minBy、maxBy等。
    元组
    类型与强制执行其必要性的
    .map
    步骤一样过时。只需使用
    users.stream().collect(Collectors.groupingBy(u->resolveType(u),Collectors.summingit(User::getPoints))
    (或
    users.stream().collector(Collectors.groupingBy(u->resolveType(u),Collectors.summaringlong(User::getPoints))
    即可获得
    长摘要统计数据。除此之外,我不会在
    resolveType
    中使用流,而只是
    返回user.getAge()<18?Type.MINOR:user.getGender()==男性?成年型男性:成年型女性注意,检查
    =18
    两次…@Holger:是的,你是对的。我刚刚习惯了使用元组(scala)。在这种情况下,Tuple+map是不必要的,但当您使用Tuple时,它会使代码更具可读性(至少对我来说)。检查