java8新特性Stream 、lambda、方法引用

Java8 新特性中的流,通常是对list进行操作,并且通常会配合lambda、方法引用语法,
流操作通常有两种可能,示例如下:

1.获取对象的属性,并操作,返回属性的新的list

        /**
         * 获取list中的某个属性,并处理
         * 获取formSources 中的formId属性,去除空值, 去重,倒序,取前12个,形成新的list<Long>
         */
        List<Long> formIds = formSources.stream()
                .filter(formSource -> formSource != null)	// lambda排空
                .map(FormSource::getFormId)					// map:限制流中的元素为formId属性(后续操作对象)
                .filter(formId -> formId != null)			// 排空		
                .distinct()									// 去重
                .sorted(Comparator.reverseOrder())			// 排序
                .limit(12)
                .collect(Collectors.toList());

2.直接操作原list,操作对象的某个属性,后,返回原对象的list

        /**
         * 直接对list 进行操作
         * 对formSource中的FormSource,formId为空的去除当前对象,具有相同的formId的去重,按formId倒序排序,后返回新的list
         */
        List<FormSource> sortedFormSource = formSources.stream()
                .filter(formSource -> formSource != null)						// 排空
                .filter(formSource -> formSource.getFormId() != null)			// 排空
                .sorted(Comparator.comparing(FormSource::getFormId).reversed())	// 排序
                .collect(Collectors												//根据属性去重
                        .collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> {
                            return o.getFormId();
                        }))), ArrayList::new));

3.经典实例

亲测可用

3.1打印对象的某个属性

    /**
     * 打印PostRuleData 的postRuleId属性;
     * @param args
     */
    public static void main(String[] args) {
        List<PostRuleData> listData = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            PostRuleData postRuleData = new PostRuleData();
            postRuleData.setPostRuleId(Long.parseLong("" + i));
            listData.add(postRuleData);
        }

        // sout,方式打印
        listData.stream().map(PostRuleData::getPostRuleId).forEach(System.out::println);
        // 流,打印方式1
        listData.stream().forEach(postRuleData -> log.info("对象id=" + postRuleData.getPostRuleId() + "; "));
        // 流,打印方式2
        listData.stream().map(PostRuleData::getPostRuleId).forEach(id -> log.info("对象id=" + id + "; "));
        // 流,同时打印index
        listData.stream().forEach(postRuleData -> log.info("第" + listData.indexOf(postRuleData) + "个对象的id=" + postRuleData.getPostRuleId()));
    }

3.2根据属性筛选对象

    /**
     * 获取匹配指定操作类型的后置规则
     *
     * @param listRule 筛选之前的后置规则
     * @param type     当前数据的操作类型
     * @return 筛选之后的后置规则
     */
    private List<PostRuleVO> getMatchedRule(List<PostRuleVO> listRule, String type) {

        /**
         * 1. operateType.size()==0,允许
         * 2. operateType.contains(),允许
         */
        return listRule.stream()
                .filter(postRuleVO -> CollectionUtils.isEmpty(postRuleVO.getOperateType()) || postRuleVO.getOperateType().contains(type))
                .collect(Collectors.toList());
    }

3.3 distinct

    /**
     * 解析formVo的引用来源
     *
     * @param formVO formVo
     * @return 字段名和该字段引用来源的map
     */
    public List<String> getFormLabels(FormVO formVO) {
        List<String> labels = new ArrayList<>();
        getDataLabels(formVO, labels);

        // 去重
        return labels.stream().distinct().collect(Collectors.toList());
    }

    // 可以获取去重后的长度
    long l = labels.stream().distinct().count();

	// 去重后,拼接输出
	String output = labels.stream().distinct().collect(Collectors.joining(","));

猜你喜欢

转载自blog.csdn.net/leinminna/article/details/100766251