JAVA8-lambda表达式简单使用

简单学习使用lambda表达式,做个记录;

Lambda表达式的语法
基本语法:
(parameters) -> expression

(parameters) ->{ statements; }

简单的入门例子:

// 1. 什么参数都不要,返回8
() -> 8  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)  



基本的Lambda例子

例1:Lambda表达式遍历List

public void m2(){
        System.out.println("==========================================================");
       List<String> list = new ArrayList<>();
      list.add("susan");
      list.add("jack");
      list.add("rose");
      list.add("evan");
      list.forEach(name-> System.out.println("name = " + name));
        // 在 Java 8 中使用双冒号操作符(double colon operator)
        list.forEach(System.out::println);
        System.out.println("==========================================================");
    }


得到结果如下:


例2:Lambda表达式实现runnable 接口

    public void m3(){
        // 1.1使用匿名内部类
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello world !");
            }
        }).start();

// 1.2使用 lambda expression
        new Thread(() -> System.out.println("Hello world !")).start();

// 2.1使用匿名内部类
        Runnable race1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello world !");
            }
        };

// 2.2使用 lambda expression
        Runnable race2 = () -> System.out.println("Hello world !");

// 直接调用 run 方法(没有开启新的线程!)
        race1.run();
        race2.run();
    }

使用Lambdas排序集合

   public void m4(){
        String [] player ={"susan","jack","honey","evan","zero"};
        //使用匿名内部类,根据name排序
        Arrays.sort(player, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o1.compareTo(o2));
            }
        });

        //lambda 表达式排序1 等同于上面的方法
        Comparator<String> stringComparator = (String s1, String s2) -> (s1.compareTo(s2));
        Arrays.sort(player,stringComparator);
        //lambda 表达式排序2 
        Arrays.sort(player,(String s1,String s2)->(s1.compareTo(s2)));

    }


***使用Lambdas和Streams

Stream是对集合的包装,通常和lambda一起使用。 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。 同样,Stream使用懒运算,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束链式语法。 在接下来的例子中,我们将探索lambdas和streams 能做什么。 我们创建了一个Person类并使用这个类来添加一些数据到list中,将用于进一步流操作。 Person 只是一个简单的POJO类:

/**
 * Created by sunzhitao on 2018/6/16.
 */
@Data
public class Person {
    private  String firstName,lastName,job,gender;
    private  int salary,age;

//省略getter setter
}

stream中的部分方法:

public class StreamService {

    List<Person> javaProgrammers = new ArrayList<Person>() {
        {
            add(new Person("Elsdon", "Jaycob", "Java programmer", "male",1,2000,43));
            add(new Person("Tamsen", "Brittany", "Java programmer", "female",2, 1500, 23));
            add(new Person("Floyd", "Donny", "Java programmer", "male", 3,1800,33));
            add(new Person("Sindy", "Jonie", "Java programmer", "female",4, 1600,32 ));
            add(new Person("Vere", "Hervey", "Java programmer", "male",5,1200,22));
            add(new Person("Maude", "Jaimie", "Java programmer", "female",6, 1900, 27));
            add(new Person("Shawn", "Randall", "Java programmer", "male",7, 2300, 30));
            add(new Person("Jayden", "Corrina", "Java programmer", "female",8, 1700, 35));
            add(new Person("Palmer", "Dene", "Java programmer", "male", 9,2000, 33));
            add(new Person("Addison", "Pam", "Java programmer", "female", 10,1300, 34));
        }
    };

    List<Person> phpProgrammers = new ArrayList<Person>() {
        {
            add(new Person("Jarrod", "Pace", "PHP programmer", "male", 11, 1550,34));
            add(new Person("Clarette", "Cicely", "PHP programmer", "female",12, 23, 1200));
            add(new Person("Victor", "Channing", "PHP programmer", "male", 13,32, 1600));
            add(new Person("Tori", "Sheryl", "PHP programmer", "female", 14,21, 1000));
            add(new Person("Osborne", "Shad", "PHP programmer", "male", 15,32, 1100));
            add(new Person("Rosalind", "Layla", "PHP programmer", "female",16, 25, 1300));
            add(new Person("Fraser", "Hewie", "PHP programmer", "male", 17,36, 1100));
            add(new Person("Quinn", "Tamara", "PHP programmer", "female", 18,21, 1000));
            add(new Person("Alvin", "Lance", "PHP programmer", "male", 19,38, 1600));
            add(new Person("Evonne", "Shari", "PHP programmer", "female",20, 40, 1800));
        }
    };

    /**
     * forEach 循环
     */
    public void forEachTest(){
        //迭代上述列表
        System.out.println("*****************************所有JAVA程序员的姓名*********************" );
//         javaProgrammers.forEach((java)-> System.out.printf("%s %s; ",java.getFirstName(),java.getLastName()));
        javaProgrammers.forEach((java)-> System.out.println(java.getFirstName()+"-"+java.getLastName()));
        System.out.println("*****************************所有PHP程序员的姓名*********************" );
//         phpProgrammers.forEach((php)-> System.out.printf("%s %s; ",php.getFirstName(),php.getLastName()));
        phpProgrammers.forEach((php)-> System.out.println(php.getFirstName()+"-"+php.getLastName()));
    }


    /**
     * forEach循环加工资
     */
    public void foreachAdd(){
        System.out.println("**********所有的程序员工资添加5%***********");
        Consumer<Person> givaRaise = e -> e.setSalary(e.getSalary()/100*5 +e.getSalary());
        javaProgrammers.forEach(givaRaise);
        phpProgrammers.forEach(givaRaise);
    }

    /**
     * stream 使用过滤器
     */
    public void fifter(){
        System.out.println("***显示月薪超过1000的java程序员***");
        javaProgrammers.stream().filter((p)->p.getSalary()>1000)
                .forEach(person -> System.out.println("person = " + person.getLastName()+"salary:"+person.getSalary()));

    }

    /**
     * 自定义过滤器,然后重用它们来执行其他操作:
     */
    public  void myFifter(){
        // 定义 filters
        Predicate<Person> ageFifter =(p)->(p.getAge() > 25);
        Predicate<Person> salaryFifter = (p)->(p.getSalary()>1200);
        Predicate<Person> genderFifter = (p)->("female".equals(p.getGender()));
        System.out.println("************   myFifter | start ****************");
        javaProgrammers.stream().filter(ageFifter)
                .filter(salaryFifter)
                .filter(genderFifter).forEach((p)-> System.out.println(p.toString()));
        System.out.println("************   myFifter | end ****************");
    }


    /**
     * 使用limit方法,可以限制结果集的个数:
     */
    public  void limitMethod(){
        System.out.println("******  limit start **********");
        javaProgrammers.stream().limit(3).forEach((p)-> System.out.println(p.toString()));
        System.out.println("******  limit end **********");
    }

    /**
     * stream中使用sort排序
     */
    public void  streamSort(){
        System.out.println(" **************  stream 使用sort排序 **************");
        Comparator<Person> comparator = (Person p1,Person p2)->(p1.getFirstName().compareTo(p2.getFirstName()));
        List<Person> collect = javaProgrammers.stream().sorted(comparator)
                .limit(5).collect(Collectors.toList());

//        List<Person> collect = javaProgrammers.stream().sorted((p, p2) -> (p.getFirstName().compareTo(p2.getFirstName())))
//                .limit(5).collect(Collectors.toList());
        collect.forEach((p)-> System.out.println(p.toString()));
    }

    /**
     * stream里面的min max方法
     */
    public  void minAndMax(){
        System.out.println(" *******  选择出工资最低的员工*********");
        Person person = javaProgrammers.stream().min((p, p1) -> (p.getSalary() - p1.getSalary())).get();
        System.out.println("工资最低的程序员是 :" + person.toString());
        System.out.println(" *******  选择出工资最高的员工*********");
        Person person1 = javaProgrammers.stream().max((p, p1) -> (p.getSalary() - p1.getSalary())).get();
        System.out.println("工资最高的程序员是 :" + person1.toString());

    }

    /**
     * 使用stream中的map方法
     */
    public  void mapMethod(){
        System.out.println("********** 将java程序员的firstName拼接成字符串************ ");
        String collect1 = javaProgrammers.stream().map(Person::getFirstName).collect(Collectors.joining(";"));
        System.out.println(" *******  放进set中  ***********");
        Set<String> collect = javaProgrammers.stream().map(Person::getFirstName).collect(Collectors.toSet());
        System.out.println(" *******  放进TreeSet中  ***********");
        TreeSet<String> collect2 = javaProgrammers.stream().map(Person::getFirstName).collect(Collectors.toCollection(TreeSet::new));
    }

    /**
     * stream中将list转map的方法
     */
    public void listToMap(){
        Map<Integer, Person> collect = javaProgrammers.stream().collect(Collectors.toMap(Person::getId, Person -> Person));
        //这个方法可能报错 `(java.lang.IllegalStateException: Duplicate key)`
        // 因为name是有可能重复的。`toMap` 有个重载方法,可以传入一个合并的函数来解决key冲突问题:
        Map<Integer, Person> collect1 = javaProgrammers.stream().collect(Collectors.toMap(Person::getId, Function.identity(),(key1,key2)->key2));
        System.out.println("collect = " + JSON.toJSONString(collect));
    }
}



记录以上的一些例子,以备查阅使用。参考blog地址:java Lambda表达式入门




猜你喜欢

转载自blog.csdn.net/sunzhitao1990/article/details/80721535
今日推荐