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

15 篇文章 0 订阅
13 篇文章 0 订阅

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(","));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值