美文网首页java8的世界Java8
基于Java8的Lambda表达式(1)

基于Java8的Lambda表达式(1)

作者: 风行者1024 | 来源:发表于2017-11-23 17:52 被阅读37次

本篇基于Java8演示工作中接触的Lambda表达式用法。
描述一个代码场景,先展示之前的一般写法,然后再用Lambda表达式写一遍。

0.1 Java8下载

JDK8下载
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

0.2 代码场景1

有一组双十一来自各个渠道的销售量数据集合,
现在为了在报表上显示,需要把数据按销售量从高到底显示。

package com.lambda;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class TestLambda {

        public static void main(String[] args) {
            List<Sales> salesList = new ArrayList<>();
            salesList.add(new Sales("天猫", 1000));
            salesList.add(new Sales("京东", 8000));
            salesList.add(new Sales("亚马逊", 200));
            salesList.add(new Sales("大润发", 600));
            salesList.add(new Sales("欧尚", 800));

            //想达到的目的:获取销量从高到低的渠道名称集合:
            //1.京东     8000
            // 2.天猫    1000
            // 3.欧尚    800
            // 4.大润发  600
            // 5.亚马逊  200

            //1. 传统方法
            Collections.sort(salesList, saleCountComparator);
            for(Sales s : salesList) {
                System.out.println(s.getChannelName()+" "+s.getSaleCount());
            }

            //2. lambda方法(获取排序后的对象集合)
            List<Sales> list2 = salesList.stream()
                    .sorted((o1,o2) -> {
                        return o2.getSaleCount() - o1.getSaleCount();
                    })
                    .collect(Collectors.toList());

            for(Sales s : list2) {
                System.out.println(s.getChannelName()+" "+s.getSaleCount());
            }

            //3. lambda方法(获取排序后的渠道名称集合)
            List<String> list3 = salesList.stream()
                    .sorted((o1,o2) -> {
                        return o2.getSaleCount() - o1.getSaleCount();
                    })
                   //map:一对一转换   输入一个对象(Sales) 转换为 一个对应的渠道名称(String)
                    .map(Sales::getChannelName)    
                    .collect(Collectors.toList());

            for(String s : list3) {
                System.out.println(s);
            }
        }

        public static Comparator saleCountComparator = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
               //o2在前,降序排列
                return ((Sales)o2).getSaleCount() - ((Sales)o1).getSaleCount(); 
            }
        };
    }

class Sales {
    private String channelName;
    private Integer saleCount;

    public Sales(String channelName, Integer saleCount) {
        this.channelName = channelName;
        this.saleCount = saleCount;
    }

    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }

    public Integer getSaleCount() {
        return saleCount;
    }

    public void setSaleCount(Integer saleCount) {
        this.saleCount = saleCount;
    }
}
0.3 代码说明

以上代码的关键是lambda写法的stream、sorted、map

  • stream
    它和以往文件等输入输出流的stream完全两个概念,
    它能够对集合对象进行各种串行或并发聚集操作,
    响应了现在多核处理器的需求。
  • sorted
    sorted函数需要传入一个实现Comparator函数式接口的对象,
    该接口的抽象方法compare接收两个参数并返回一个整型值,
    作用就是排序,因为做了精简,所以代码上比传统的精简很多:
.sorted((o1,o2) ->  o2.getSaleCount() - o1.getSaleCount())

以上是精简的写法,但是我个人习惯加上{},可读性可能会好些:

.sorted((o1,o2)  -> {
                        return o2.getSaleCount() - o1.getSaleCount();
                    })
  • map
    map函数需要传入一个实现Function函数式接口的对象,
    该接口的抽象方法apply接收一个参数并返回一个值,
    可以理解为映射关系,上面的代码就是将每一个Sales对象映射为一个channelName的String对象
.map(Sales::getChannelName)

(注意语法,中间是2个冒号,类似C++的方法调用)


写本文仅仅是为了演示Lambda表达式的常用写法,至于可读性、可维护性、性能高低等方面,大家根据实际情况去判断吧。
由于作者水平有限,难免出现纰漏,如有问题请帮忙指正,谢谢!

下一篇 基于Java8的Lambda表达式(2)

相关文章

网友评论

    本文标题:基于Java8的Lambda表达式(1)

    本文链接:https://www.haomeiwen.com/subject/hsobvxtx.html