Java 自定义StreamUtils工具类,生产力max,后端程序员必看。

Java Stream工具类操作使用

  1. 介绍

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式。Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作。

  2. 直接源码(目前只写了那么多,后面如果有其他小伙伴想写其他的,都可以。)

    public class StreamUtils<T> {
    
        /**
         * 操作的集合
         */
        private List<T> list;
    
        /**
         * 构造方法
         *
         * @param list 操作的集合
         */
        private StreamUtils(List<T> list) {
            this.list = list;
        }
    
        /**
         * 获取StreamUtils
         *
         * @param list 操作的集合
         * @param <T>  泛型
         * @return StreamUtils
         */
        public static <T> StreamUtils<T> from(List<T> list) {
            return new StreamUtils<>(list);
        }
    
        /**
         * 封装Stream流filter方法
         *
         * @param predicate 条件
         * @return
         */
        public StreamUtils<T> filter(Predicate<T> predicate) {
            list = list.stream().filter(predicate).collect(Collectors.toList());
            return this;
        }
    
        /**
         * 取出某个属性的值
         *
         * @param mapper
         * @param <R>
         * @return
         */
        public <R> StreamUtils<R> map(Function<T, R> mapper) {
            List<R> result = list.stream().map(mapper).collect(Collectors.toList());
            return new StreamUtils<>(result);
        }
    
        /**
         * 集合转到map中,以对象其中的一个属性为key
         *
         * @param keyMapper
         * @param valueMapper
         * @return
         */
        public Map<T, T> toMap(Function<T, T> keyMapper, Function<T, T> valueMapper) {
            return list.stream().collect(Collectors.toMap(keyMapper, valueMapper));
        }
    
        /**
         * 对集合去重
         *
         * @return
         */
        public StreamUtils<T> distinct() {
            list = list.stream().distinct().collect(Collectors.toList());
            return this;
        }
    
        /**
         * 取最大
         *
         * @param comparator
         * @return
         */
        public Optional<T> max(Comparator<T> comparator) {
            return list.stream().max(comparator);
        }
    
        /**
         * 取最小
         *
         * @param comparator
         * @return
         */
        public Optional<T> min(Comparator<T> comparator) {
            return list.stream().min(comparator);
        }
    
        /**
         * 等于
         *
         * @param keyExtractor
         * @param value
         * @return
         */
        public StreamUtils<T> eq(Function<T, Object> keyExtractor, Object value) {
            return filter(obj -> Objects.equals(keyExtractor.apply(obj), value));
        }
    
        /**
         * 等于
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param value
         * @return
         */
        public StreamUtils<T> eq(boolean condition, Function<T, Object> keyExtractor, Object value) {
            return condition ? filter(obj -> Objects.equals(keyExtractor.apply(obj), value)) : this;
        }
    
        /**
         * 是否为null
         *
         * @return
         */
        public StreamUtils<T> isNull(Function<T, Object> keyExtractor) {
            return filter(obj -> Objects.isNull(keyExtractor.apply(obj)));
        }
    
        /**
         * 是否为null
         *
         * @param condition 判断是否参与查询的条件
         * @return
         */
        public StreamUtils<T> isNull(boolean condition, Function<T, Object> keyExtractor) {
            return condition ? filter(obj -> Objects.isNull(keyExtractor.apply(obj))) : this;
        }
    
        /**
         * 是否为空
         *
         * @return
         */
        public StreamUtils<T> isEmpty(Function<T, Object> keyExtractor) {
            return filter(obj -> ObjectUtil.isEmpty(keyExtractor.apply(obj)));
        }
    
        /**
         * 是否为空
         *
         * @param condition 判断是否参与查询的条件
         * @return
         */
        public StreamUtils<T> isEmpty(boolean condition, Function<T, Object> keyExtractor) {
            return condition ? filter(obj -> ObjectUtil.isEmpty(keyExtractor.apply(obj))) : this;
        }
    
        /**
         * 是否不为null
         *
         * @return
         */
        public StreamUtils<T> isNotNull(Function<T, Object> keyExtractor) {
            return filter(obj -> Objects.nonNull(keyExtractor.apply(obj)));
        }
    
        /**
         * 是否不为null
         *
         * @param condition 判断是否参与查询的条件
         * @return
         */
        public StreamUtils<T> isNotNull(boolean condition, Function<T, Object> keyExtractor) {
            return condition ? filter(obj -> Objects.nonNull(keyExtractor.apply(obj))) : this;
        }
    
        /**
         * 是否不为空
         *
         * @return
         */
        public StreamUtils<T> isNotEmpty(Function<T, Object> keyExtractor) {
            return filter(obj -> ObjectUtil.isNotEmpty(keyExtractor.apply(obj)));
        }
    
        /**
         * 是否不为空
         *
         * @param condition 判断是否参与查询的条件
         * @return
         */
        public StreamUtils<T> isNotEmpty(boolean condition, Function<T, Object> keyExtractor) {
            return condition ? filter(obj -> ObjectUtil.isNotEmpty(keyExtractor.apply(obj))) : this;
        }
    
        /**
         * 不等于
         *
         * @param keyExtractor
         * @param value
         * @return
         */
        public StreamUtils<T> ne(Function<T, Object> keyExtractor, Object value) {
            return filter(obj -> !Objects.equals(keyExtractor.apply(obj), value));
        }
    
        /**
         * 不等于
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param value
         * @return
         */
        public StreamUtils<T> ne(boolean condition, Function<T, Object> keyExtractor, Object value) {
            return condition ? filter(obj -> !Objects.equals(keyExtractor.apply(obj), value)) : this;
        }
    
        /**
         * 大于等于
         *
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> ge(Function<T, U> keyExtractor, U threshold) {
            return filter(obj -> {
                U value = keyExtractor.apply(obj);
                return null != value && value.compareTo(threshold) >= 0;
            });
        }
    
        /**
         * 大于等于
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> ge(boolean condition, Function<T, U> keyExtractor, U threshold) {
            return condition ? filter(obj -> {
                U value = keyExtractor.apply(obj);
                return null != value && value.compareTo(threshold) >= 0;
            }) : this;
        }
    
        /**
         * 大于
         *
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> gt(Function<T, U> keyExtractor, U threshold) {
            // return filter(obj -> keyExtractor.apply(obj).compareTo(threshold) > 0);
            return filter(obj -> {
                U value = keyExtractor.apply(obj);
                return value != null && value.compareTo(threshold) > 0;
            });
        }
    
        /**
         * 大于
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> gt(boolean condition, Function<T, U> keyExtractor, U threshold) {
            return condition ? filter(obj -> {
                U value = keyExtractor.apply(obj);
                return null != value && value.compareTo(threshold) > 0;
            }) : this;
        }
    
        /**
         * 小于等于
         *
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> le(Function<T, U> keyExtractor, U threshold) {
            return filter(obj -> {
                U value = keyExtractor.apply(obj);
                return null != value && value.compareTo(threshold) <= 0;
            });
        }
    
        /**
         * 小于等于
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> le(boolean condition, Function<T, U> keyExtractor, U threshold) {
            return condition ? filter(obj -> {
                U value = keyExtractor.apply(obj);
                return null != value && value.compareTo(threshold) <= 0;
            }) : this;
        }
    
        /**
         * 小于
         *
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> lt(Function<T, U> keyExtractor, U threshold) {
            // return filter(obj -> keyExtractor.apply(obj).compareTo(threshold) < 0);
            return filter( obj -> {
                U value = keyExtractor.apply(obj);
                return value != null && value.compareTo(threshold) < 0;
            });
        }
    
        /**
         * 小于
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param threshold
         * @return
         */
        public <U extends Comparable<U>> StreamUtils<T> lt(boolean condition, Function<T, U> keyExtractor, U threshold) {
            return condition ? filter(obj -> {
                U value = keyExtractor.apply(obj);
                return value != null && value.compareTo(threshold) < 0;
            }) : this;
        }
    
        /**
         * 模糊查询:%like%
         *
         * @param keyExtractor
         * @param pattern
         * @return
         */
        public StreamUtils<T> like(Function<T, String> keyExtractor, String pattern) {
            return filter(obj -> {
                String fieldValue = keyExtractor.apply(obj);
                return fieldValue != null && fieldValue.contains(pattern);
            });
        }
    
        /**
         * 模糊查询:%like%
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param pattern
         * @return
         */
        public StreamUtils<T> like(boolean condition, Function<T, String> keyExtractor, String pattern) {
            return condition ? filter(obj -> {
                String fieldValue = keyExtractor.apply(obj);
                return fieldValue != null && fieldValue.contains(pattern);
            }) : this;
        }
    
        /**
         * in:包含
         *
         * @param keyExtractor
         * @param values
         * @return
         */
        public StreamUtils<T> in(Function<T, Object> keyExtractor, Collection<?> values) {
            return filter(obj -> {
                Object fieldValue = keyExtractor.apply(obj);
                return CollUtil.isNotEmpty(values) && values.contains(fieldValue);
            });
        }
    
        /**
         * in:包含
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param values
         * @return
         */
        public StreamUtils<T> in(boolean condition, Function<T, Object> keyExtractor, Collection<?> values) {
            return condition ? filter(obj ->
            {Object fieldValue = keyExtractor.apply(obj);
                return CollUtil.isNotEmpty(values) && values.contains(fieldValue);}) : this;
        }
    
        /**
         * notIn:不包含
         *
         * @param keyExtractor
         * @param values
         * @return
         */
        public StreamUtils<T> notIn(Function<T, Object> keyExtractor, Collection<?> values) {
            return filter(obj -> {
                Object fieldValue = keyExtractor.apply(obj);
                return !(CollUtil.isNotEmpty(values) && values.contains(fieldValue));
            });
        }
    
        /**
         * notIn:不包含
         *
         * @param condition 判断是否参与查询的条件
         * @param keyExtractor
         * @param values
         * @return
         */
        public StreamUtils<T> notIn(boolean condition, Function<T, Object> keyExtractor, Collection<?> values) {
            return condition ? filter(obj -> {
                Object fieldValue = keyExtractor.apply(obj);
                return !(CollUtil.isNotEmpty(values) && values.contains(fieldValue));
            }) : this;
        }
    
        /**
         * 查找一个
         *
         * @param predicate
         * @return
         */
        public Optional<T> getOne(Predicate<T> predicate) {
            return list.stream().filter(predicate).findFirst();
        }
    
        /**
         * 查找第一个
         *
         * @param predicate
         * @return
         */
        public T findFirst(Predicate<T> predicate) {
            return list.stream().filter(predicate).findFirst().orElse(null);
        }
    
        /**
         * 查找第一个
         *
         * @return
         */
        public T findFirst() {
            return list.stream().findFirst().orElse(null);
        }
    
        /**
         * 查找第一个
         *
         * @return
         */
        public T getOne() {
            return list.isEmpty() ? null : list.get(0);
        }
    
        /**
         * not取反操作,
         *
         * @param predicate
         * @return
         */
        public StreamUtils<T> not(Predicate<T> predicate) {
            return filter(predicate.negate());
        }
    
        /**
         * 并且 and连接符
         *
         * @param other
         * @return
         */
        public StreamUtils<T> and(StreamUtils<T> other) {
            list.retainAll(other.list);
            return this;
        }
    
        /**
         * 或者
         *
         * @param other
         * @return
         */
        public StreamUtils<T> or(StreamUtils<T> other) {
            other.list.removeAll(list);
            list.addAll(other.list);
            return this;
        }
    
        /**
         * 默认排序,升序
         *
         * @param comparator
         * @return
         */
        public StreamUtils<T> orderBy(Comparator<T> comparator) {
            list.sort(comparator);
            return this;
        }
    
        /**
         * 排序,可指定排序方式
         *
         * @param comparator 排序
         * @param orderBy    1:降序,0:升序
         * @return
         */
        public StreamUtils<T> orderBy(Comparator<T> comparator, int orderBy) {
            if (1 == orderBy) {
                list.sort(comparator.reversed());
            } else {
                orderBy(comparator);
            }
            return this;
        }
    
        /**
         * 排序,可指定排序方式,可以指定条件,条件为true时才执行排序
         *
         * @param comparator 排序
         * @param condition 条件
         * @param orderBy    1:降序,0:升序
         * @return
         */
        public StreamUtils<T> orderBy(boolean condition, Comparator<T> comparator, int orderBy) {
            if (condition) {
                if (1 == orderBy) {
                    list.sort(comparator.reversed());
                } else {
                    orderBy(comparator);
                }
            }
            return this;
        }
    
        /**
         * 获取一个List
         *
         * @return
         */
        public List<T> toList() {
            return list;
        }
    }
    

    生产环境已经用了几个月了,无翻车,朋友们,可以放心食用。

  3. 简单解释

    • 其实还是受到了一些mybatis plus的一些启发的,在这里,鸣谢致敬:@baomidou,@chatgpt,主要是用了MP(mybaits-plus,后面都用这个简称),比如一些eq,ne,ge,le这些方法的命名啥的,都是跟着它来的,也是非常喜欢MP的一个lamdba写法,所以才想出了要写个StreamUtils工具类,效仿一下MP的使用,对List集合进行操作。下面我们来看看具体哪些用法,还有我比较常用的。

      上面工具类中写了很多的方法对吧,什么eq,ne,啥啥啥的,其实啊,也都是源自一个java 8的Stream的方法,那就是filter方法,包括没有这个工具类之前,我也都是用这个方法筛选集合,怎么说呢,其实也是比较方便了,最起码比你自己for循环好多了,但是人嘛,都是这样,没有最,只有更。懒惰才是科技第一生产力,手动狗头。所以就有了这个工具类的诞生。

    • 简单常用方法使用举例,和解释。

      • 先来看看所有筛选方法的老祖宗。

            /**
             * 封装Stream流filter方法
             *
             * @param predicate 条件
             * @return
             */
            public StreamUtils<T> filter(Predicate<T> predicate) {
                list = list.stream().filter(predicate).collect(Collectors.toList());
                return this;
            }
        // 这里就是简单的调用stream的filter方法,只不过,方法参数的这个条件,是自己定义的,也就是自己写条件。基本上和自己用filter差不多。不过后面会在不同的方法中做不同的操作。
        
      • 我们先来看看eq方法,也就是等于

        /**
             * 等于
             *
             * @param keyExtractor
             * @param value
             * @return
             */
            public StreamUtils<T> eq(Function<T, Object> keyExtractor, Object value) {
                return filter(obj -> Objects.equals(keyExtractor.apply(obj), value));
            }
        
            /**
             * 等于
             *
             * @param condition 判断是否参与查询的条件
             * @param keyExtractor
             * @param value
             * @return
             */
            public StreamUtils<T> eq(boolean condition, Function<T, Object> keyExtractor, Object value) {
                return condition ? filter(obj -> Objects.equals(keyExtractor.apply(obj), value)) : this;
            }
        // 这个效仿MP,基本上每个筛选的方法都有重载的方法,会多一个condition条件参数,用于筛选前的判断操作,类似于mybatis的If标签。后面会演示condition的作用。可以看到,这个eq方法就是调用了前面的filter方法,传的条件中,写死了用equals比较,这里使用了java.util包下的Objects类的equals方法,是比较安全的方法,即使第一个参数有空也不会NP。
        
        • 我们来看看实践

          自定义一个专门用来测试的类

          /**
           * @author GmDsg
           * @date 2023/8/14 11:21
           * @description TODO
           */
          @Data
          public class TestCls {
              
              
              private String name;
              
              private Integer num;
              
              private BigDecimal amount;
          }
          
                  // eq实践
                  List<TestCls> testClsList = new ArrayList<>();
                  for (int i = 0; i < 10; i++) {
                      testClsList.add(new TestCls("mingcheng" + i, i, NumberUtil.mul(10, new BigDecimal(i))));
                  }
                  // 筛选name = mingcheng1的元素
                  List<TestCls> mingcheng1 = StreamUtils
                          .from(testClsList)
                          .eq(TestCls::getName, "mingcheng1")
                          .toList();
          
          // 结果:[TestCls(name=mingcheng1, num=1, amount=10)]
          

          重载方法,带condition参数用法

                  List<TestCls> testClsList = new ArrayList<>();
                  for (int i = 0; i < 10; i++) {
                      testClsList.add(new TestCls("mingcheng" + i, i, NumberUtil.mul(10, new BigDecimal(i))));
                  }        
          		// 重载方法condition参数用法
                  List<TestCls> mingcheng1 = StreamUtils
                          .from(testClsList)
                          .eq(CollUtil.isNotEmpty(testClsList), TestCls::getName, "mingcheng1")
                          .toList();
                  System.out.println(mingcheng1);
          // 加了个条件,只有testClsList不为空的情况才会按照name筛选,否则不筛选。
          // 结果:[TestCls(name=mingcheng1, num=1, amount=10)]和上面一样。
          

          那我们直接用false试试。

                  List<TestCls> testClsList = new ArrayList<>();
                  for (int i = 0; i < 10; i++) {
                      testClsList.add(new TestCls("mingcheng" + i, i, NumberUtil.mul(10, new BigDecimal(i))));
                  }        
          		// 重载方法condition参数用法
                  List<TestCls> mingcheng1 = StreamUtils
                          .from(testClsList)
                          .eq(false, TestCls::getName, "mingcheng1")
                          .toList();
                  System.out.println(JSONUtil.toJsonStr(mingcheng1));
          
          

          结果:

          [
           {"name":"mingcheng0","num":0,"amount":0},
           {"name":"mingcheng1","num":1,"amount":10},
           {"name":"mingcheng2","num":2,"amount":20},
           {"name":"mingcheng3","num":3,"amount":30},
           {"name":"mingcheng4","num":4,"amount":40},
           {"name":"mingcheng5","num":5,"amount":50},
           {"name":"mingcheng6","num":6,"amount":60},
           {"name":"mingcheng7","num":7,"amount":70},
           {"name":"mingcheng8","num":8,"amount":80},
           {"name":"mingcheng9","num":9,"amount":90}
          ]
          // 可以看到,如果前置条件的condition为flase时,则不会执行条件筛选。
          

          再来看看不等于条件筛选

          		// 反之,筛选name != mingcheng1的元素        
          		List<TestCls> mingchengbdy1 = StreamUtils
                          .from(testClsList)
                          .ne(TestCls::getName, "mingcheng1")
                          .toList();
                  System.out.println(JSONUtil.toJsonStr(mingchengbdy1));
          

          结果:

          [
              {"name":"mingcheng0","num":0,"amount":0},
              {"name":"mingcheng2","num":2,"amount":20},
              {"name":"mingcheng3","num":3,"amount":30},
              {"name":"mingcheng4","num":4,"amount":40},
              {"name":"mingcheng5","num":5,"amount":50},
              {"name":"mingcheng6","num":6,"amount":60},
              {"name":"mingcheng7","num":7,"amount":70},
              {"name":"mingcheng8","num":8,"amount":80},
              {"name":"mingcheng9","num":9,"amount":90}
          ]
          // 把“mingcheng1”的元素筛选掉了。
          
          • 这个也是有condition条件的方法,就不一一举例了,用法都一样。包括什么大于,小于,源码中方法都有注释,可以自行尝试。

          大于,小于,大于等于等方法

                  // 筛选amount大于等于50的元素
          		List<TestCls> geAmount = StreamUtils
                          .from(testClsList)
                          .ge(TestCls::getAmount, new BigDecimal("50"))
                          .toList();
                  System.out.println(JSONUtil.toJsonStr(geAmount));
          

          结果:

          [
              {"name":"mingcheng5","num":5,"amount":50},
              {"name":"mingcheng6","num":6,"amount":60},
              {"name":"mingcheng7","num":7,"amount":70},
              {"name":"mingcheng8","num":8,"amount":80},
              {"name":"mingcheng9","num":9,"amount":90}
          ]
          // 筛选成功。
          

          试一试排序,降序排序,升序降序都可以。

              /**
               * 默认排序,升序
               *
               * @param comparator
               * @return
               */
              public StreamUtils<T> orderBy(Comparator<T> comparator) {
                  list.sort(comparator);
                  return this;
              }
          
              /**
               * 排序,可指定排序方式
               *
               * @param comparator 排序
               * @param orderBy    1:降序,0:升序
               * @return
               */
              public StreamUtils<T> orderBy(Comparator<T> comparator, int orderBy) {
                  if (1 == orderBy) {
                      list.sort(comparator.reversed());
                  } else {
                      orderBy(comparator);
                  }
                  return this;
              }
          

          来一个降序排序

                  // 筛选amount大于等于50的元素,并且安排amount降序排序
                  List<TestCls> geAmount = StreamUtils
                          .from(testClsList)
                          .ge(TestCls::getAmount, new BigDecimal("50"))
                          .orderBy(Comparator.comparing(TestCls::getAmount), 1)
                          .toList();
                  System.out.println(JSONUtil.toJsonStr(geAmount));
          

          结果:

          [
              {"name":"mingcheng9","num":9,"amount":90},
              {"name":"mingcheng8","num":8,"amount":80},
              {"name":"mingcheng7","num":7,"amount":70},
              {"name":"mingcheng6","num":6,"amount":60},
              {"name":"mingcheng5","num":5,"amount":50}
          ]
          

          排序成功。

    上面的都是获取返回一个集合,也有返回单个的方法,例如MP的getOne方法。工具类中有findFirst和getOne,其实都差不多,用哪个都可以,也可以用max和min方法,取最大的一个或者最小的一个。

            // findFirst
            TestCls geAmountMax = StreamUtils
                    .from(testClsList)
                    .ge(TestCls::getAmount, new BigDecimal("50"))
                    .orderBy(Comparator.comparing(TestCls::getAmount), 1)
                    .findFirst();
            System.out.println(JSONUtil.toJsonStr(geAmountMax));
    

    其实这个就是查最大的一个,后面也有max方法代替。

​ 结果:

{"name":"mingcheng9","num":9,"amount":90}

max方法

        // max方法
        TestCls geAmountMax = StreamUtils
                .from(testClsList)
                .max(Comparator.comparing(TestCls::getAmount, Comparator.nullsFirst(BigDecimal::compareTo))) // 最好加上Comparator.nullsFirst(BigDecimal::compareTo),防止空指针异常。
                .orElse(null);
        System.out.println(JSONUtil.toJsonStr(geAmountMax));

结果:

{"name":"mingcheng9","num":9,"amount":90}

结果是一样的。

此外我还写了isNull,isNotNull,isEmpty,isNotEmpty,可用来筛选为null,或者为空的元素。

演示一个isNotEmpty的用法,其余的用法一致。

        List<TestCls> testClsList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) {
                testClsList.add(new TestCls("", i, NumberUtil.mul(10, new BigDecimal(i))));
            } else {
                testClsList.add(new TestCls("mingcheng" + i, i, NumberUtil.mul(10, new BigDecimal(i))));
            }
        }
// 循环语句更改,如果是 i 被2整除,则设置该元素的name字段为空字符串。

调用isNotEmpty方法筛选元素

        // 筛选出name不为空串的元素
        List<TestCls> notEmptyList = StreamUtils
                .from(testClsList)
                .isNotEmpty(TestCls::getName)
                .toList();
        System.out.println(JSONUtil.toJsonStr(notEmptyList));

结果:

[
    {"name":"mingcheng1","num":1,"amount":10},
    {"name":"mingcheng3","num":3,"amount":30},
    {"name":"mingcheng5","num":5,"amount":50},
    {"name":"mingcheng7","num":7,"amount":70},
    {"name":"mingcheng9","num":9,"amount":90}
]

筛选成功。

反之筛选name为空的元素

        // 筛选出name为空串的元素
        List<TestCls> notEmptyList = StreamUtils
                .from(testClsList)
                .isEmpty(TestCls::getName)
                .toList();
        System.out.println(JSONUtil.toJsonStr(notEmptyList));

结果:

[
    {"name":"","num":0,"amount":0},
    {"name":"","num":2,"amount":20},
    {"name":"","num":4,"amount":40},
    {"name":"","num":6,"amount":60},
    {"name":"","num":8,"amount":80}
]

看到这里,大家好觉得我强吗?觉得强的话,记得给个赞!不要着急,后面还有好多用法呢!

还有一个就是or 和 and的用法,and目前没用过生产,or用了生产,无翻车。

        // 筛选出name不为空,或者amount大于等于50的元素
        List<TestCls> orList = StreamUtils
                .from(testClsList)
                .isNotEmpty(TestCls::getName)
                .or(StreamUtils.from(testClsList)
                        .ge(TestCls::getAmount, new BigDecimal("50")))
                .toList();

结果:

[
    {"name":"mingcheng1","num":1,"amount":10},
    {"name":"mingcheng3","num":3,"amount":30},
    {"name":"mingcheng5","num":5,"amount":50},
    {"name":"mingcheng7","num":7,"amount":70},
    {"name":"mingcheng9","num":9,"amount":90},
    {"name":"","num":6,"amount":60},
    {"name":"","num":8,"amount":80}
]

可以非常好,没让我失望。

同样的我们再用个and来试试。

        // 筛选出name不为空并且amount大于等于50的元素
        List<TestCls> andList = StreamUtils
                .from(testClsList)
                .isNotEmpty(TestCls::getName)
                .and(StreamUtils.from(testClsList)
                        .ge(TestCls::getAmount, new BigDecimal("50")))
                .toList();
        System.out.println(JSONUtil.toJsonStr(andList));

结果:

[
    {"name":"mingcheng5","num":5,"amount":50},
    {"name":"mingcheng7","num":7,"amount":70},
    {"name":"mingcheng9","num":9,"amount":90}
]

好帅一个!

in 和 notIn方法,类似于SQL语句中的用法,包含,不包含。

        List<Integer> list = Arrays.asList(76, 5445, 776, 243, 7, 88, 98, 35, 5234, 56, 324, 54);

        // notIn
        List<Integer> list2 = StreamUtils
                .from(list)
                .notIn(s -> s, Arrays.asList(88, 98, 35, 5234))
                .toList();
        System.out.println(list2);

结果:

[76, 5445, 776, 243, 7, 56, 324, 54]

in方法使用

        // in
        List<Integer> list3 = StreamUtils
                .from(list)
                .in(s -> s, Arrays.asList(88, 98, 35, 5234))
                .toList();
        System.out.println(list3);

结果:

[88, 98, 35, 5234]

还有准备写最后一个,map方法,就是取某个属性的属性值,另外返回一个集合,比如,取集合中所有的amount字段,结果就会获取

一个List的集合。

        // map方法获取amount属性
        List<BigDecimal> mapList = StreamUtils
                .from(testClsList)
                .map(TestCls::getAmount)
                .toList();
        System.out.println(mapList);

结果:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

到这里,这个StreamUtils工具类就写的差不多了,我的天哪,真累啊,写文档不是啥好活儿,不过只要能帮助到大家,我就知足了。如果后面大家又更好的想法,也可以自行补充到这个类中,也可以给我留言,让我也学习学习,加到里面,然后我们一起快乐的coding!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AnimationUtils 动画工具类 AppUtils APP相关信息工具类 AssetDatabaseOpenHelper 目录资源获取 Base64 加密 BitmapUtil 获取Bitmap和对Bitmap的操作 ChannelUtil 获取市场号 Colors 颜色工具类 包括常用的色值 DES DES加密解密类 DataCleanManager 本应用数据清除管理器 DatabaseExportUtils 应用数据库导出工具类 DateUtil 日期操作工具类 DbHelper 数据库帮助类 DensityUtil 屏幕信息获取数值的转换 DeviceStatusUtils 手机状态工具类 主要包括网络、蓝牙、屏幕亮度、飞行模式、音量等 DigestUtils DigestUtils FileUtils 文件操作 HanziToPinyin 拼音汉字处理 IOUtils IOUtils MD5 MD5 MiscUtils 设备信息的获取 NetWorkUtils 网络状态 PhoneUtil 手机组件调用工具类 PreferencesUtils sp工具类 RandomUtils 随机数工具类 RecorderControl 录音工具类 SerializeUtils Serialize ShellUtils shell指令 ShortCutUtils 创建删除快捷图标 SingletonUtils 单例工具 SizeUtils SizeUtils SqliteUtils SqliteUtils StreamUtils 流转换成字符串 StringUtils String SystemUtils 线程池工具类 TimeUtils TimeUtils ToastUtils ToastUtils TransitionTime 用来计算显示的时间是多久之前 ViewAnimationUtils 视图动画工具箱,提供简单的控制视图的动画的工具方法 ViewUtils view控制 WiFiUtil WiFiUtil WindowUtils 窗口工具箱 ZipUtil 实现的Zip工具 BadgeUtil 设置Badge LogUtil LogUti工具类 ArrayUtils 数组工具类,提供一些有关数组的便捷方法 ByteUtils 字节工具类,提供一些有关字节的便捷方法 CheckAdapter 选择适配器 CheckingUtils 提供常用数据验证的工具类,不符合的话就抛异常 Countdown 倒计时器 DialogUtils 对话框工具箱 DoubleClickExitDetector 双击退出识别器 ImageProcessor 图片处理器 InputMethodUtils 软键盘工具类 LoopTimer 循环定时器 NestedGridView 嵌套使用的GridView NestedListView 嵌套使用的ListView OSUtils Android系统工具箱 OtherUtils 主要是给字符串添加html ReflectUtils 反射工具类,提供一些Java基本的反射功能 RegexUtils 正则表达式工具类,提供一些常用的正则表达式 SDCardUtils SD卡工具箱 Symbols 常用符号 WebViewManager WebView管理器,提供常用设置 原地址:https://github.com/l123456789jy/Lazy
### 回答1: Java后端程序员可以通过以下方式来成长: 1. 不断学习和掌握新的技术和框架,如Spring, Hibernate等。 2. 完成项目,并且不断总结和提高。 3. 参加技术社区活动,和其他程序员交流和学习。 4. 阅读相关技术文章和书籍,不断提高自己的理解能力。 5. 注意代码质量和可维护性,并且不断提高自己的编码能力。 ### 回答2: 要成为一名优秀的Java后端程序员,以下是一些成长的关键点: 1. 扎实的基础知识:掌握Java语言的基础知识,如语法、面向对象编程、异常处理等。还要了解常用的数据结构和算法,以便在解决问题时能够选择合适的解决方案。 2. 学习框架和工具:深入学习常用的Java后端框架,如Spring、Hibernate等,理解它们的原理和使用方式。同时掌握常用的开发工具,如Eclipse、IntelliJ IDEA等,提高开发效率。 3. 实践项目经验:参与实际项目开发,不断积累实战经验。通过实践,了解项目开发流程、团队协作和版本控制等,同时也可以发现和解决一些实际问题。 4. 深入学习数据库:掌握常用的关系型数据库和NoSQL数据库,如MySQL、MongoDB等。了解数据库的原理和优化技巧,能够设计和优化数据库模型。 5. 持续学习和自我提升:Java后端是一个快速发展的领域,需要保持学习的热情和积极性。关注新技术和行业动态,参加技术交流活动,阅读相关书籍和文章,不断提升自己的技术水平。 6. 理解业务需求:作为一名优秀的Java后端程序员,需要与产品和需求团队紧密合作,理解业务需求并转化为可行的技术方案。同时注重与前端开发人员的协作,保证整个系统的协同工作。 7. 代码质量和可维护性:编写高质量的代码是成长的关键。注重编码规范,使用设计模式和合理的架构,编写具有可读性、可维护性和可扩展性的代码。 8. 锻炼解决问题的能力:Java后端开发过程中,经常会面临各种问题和挑战,要有解决问题的能力。培养良好的问题分析和解决思路,能够快速定位问题并给出解决方法。 总之,作为Java后端程序员,成长的关键在于持续学习、不断实践和提升自我的能力。只有通过不断地努力和不断提高,才能成为一名优秀的Java后端程序员。 ### 回答3: 作为一名 Java 后端程序员,要想不断成长,以下几点是很关键的: 1. 深入学习和掌握 Java 技术:Java 是一门广泛应用于后端开发的编程语言,了解核心概念和基础知识是成长的第一步。通过学习官方文档、书籍、在线教程等,掌握 Java 的语法、面向对象编程、多线程、集合等核心技术。 2. 实践项目经验:通过参与实际项目,积累实践经验是成长的重要途径。可以通过参与个人项目、开源项目,或者是向公司申请承担一些有挑战性的工作任务,来提升解决问题的能力和技术广度。 3. 学习框架和工具:Java 后端开发中使用了许多优秀的框架,如 Spring、MyBatis、Hibernate 等。深入了解这些框架的原理和使用方法,可以提高开发效率和代码质量。 4. 关注行业动态和技术趋势:技术日新月异,了解当前行业的动态和技术趋势对于 Java 后端程序员至关重要。可以通过关注技术博客、参与技术社区等方式,及时了解新的技术和工具,不断拓宽技术视野。 5. 不断学习和自我更新:作为一名程序员,持续学习和自我更新是非常重要的。可以通过定期参加培训课程、参与技术社区讨论、阅读技术书籍等方式,不断提升自己的技术水平和专业素养。 6. 提高解决问题的方法和思维:作为一名 Java 后端程序员,解决问题是日常工作的重要一环。要学会运用科学的方法和合理的思维来解决问题,善于分析、排查和调试代码,提高代码的可维护性和性能。 7. 不断挑战自我:面对技术难题和挑战时,不要畏惧,要积极主动地接受挑战并解决问题。通过接触一些新领域和技术,接触一些有挑战性的项目,可以不断挑战自我,从中获得成长。 总之,Java 后端程序员要想不断成长,需要不断学习新技术,实践项目经验,关注行业动态,提升解决问题的能力和思维方式,并时刻保持学习的状态和自我挑战的心态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值