java8 lambda表达式详解及示例

lambda表达式是java8的新特性,这里做简单的介绍和常用功能的示例

在使用lambda表达式时,较为重要的一个内容则是stream(在后面的示例中会经常用到stream,在这里先做介绍一下,有个概念和映象)

具体可以参考如下博客地址

https://blog.csdn.net/lidai352710967/article/details/82496783

 

下面是lambda表达式的示例代码:

package com.delta.lambdaTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import com.mysql.cj.x.protobuf.MysqlxCrud.Collection;

public class LambdaTest {
	public static void main(String[] args) {
		int num = Runtime.getRuntime().availableProcessors();
		System.out.println("处理器:"+num);
		
		
		//不用时
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("不用lambda时实现方法");
			}
		}).start();
		//Lambda表达式实现runnable
		new Thread(()-> {
			System.out.println("lambda实现run方法");
		}).start();
		
		//用lambda表达式对列表进行迭代
		
		 String[] atp = {"Rafael Nadal", "Novak Djokovic",
	                "Stanislas Wawrinka",
	                "David Ferrer","Roger Federer",
	                "Andy Murray","Tomas Berdych",
	                "Juan Martin Del Potro"};
		 
		 //把当前的Array转换为List
		 List<String> players = Arrays.asList(atp);
		 //以前使用循环
		 for(String player: players) {
			 System.out.println(player+" ,");
		 }
		 
		 //使用lambda表达式
		 System.out.println("使用lambda实现for");
		 players.forEach((player)->System.out.println(player+"' "));
		 
		 //zai java8中使用双:实现迭代 forEach仅仅是做迭代用,没有任何返回值 需要处理的函数在()括号中传入
		 System.out.println("java8 中使用双:");
		 players.forEach(System.out::println);
		 players.forEach((player)->{
			String playerTemp = player+"-"+"test"+" ";
			System.out.println("playerTemp is:"+playerTemp);
		 });
		 
		 //使用lambda表达式做集合排序
		 System.out.println("排序---匿名内部内");
//		 players.sort(new Comparator<String>() {
//
//			@Override
//			public int compare(String o1, String o2) {
//				// TODO Auto-generated method stub
//				return o1.compareTo(o2);
//			}
//		});
		 
		 players.forEach((player)->System.out.println(player));
		 //先定义排序的方法
		 Comparator<String> sortByName = (String s1,String s2)->(s1.compareTo (s2));
		 //先进行排序
		 Collections.sort(players,sortByName);
		 System.out.println("排序后");
		 players.forEach((player)->System.out.println(player));
		 
		 //使用lambda表达式和函数式接口Predicate
		 System.out.println("测试Predicate");
		 testPredicate();
		 
		 
		 
		 
	}
	
	public static void testPredicate() {
		
		List<Person> javaProgrammers = new ArrayList<Person>() {
            {
                add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
                add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));
                add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));
                add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
                add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
                add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));
                add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));
                add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
                add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
                add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));
            }
        };
        
        
        List<Person> phpProgrammers = new ArrayList<Person>() {
            {
                add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));
                add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));
                add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));
                add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));
                add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));
                add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));
                add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));
                add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));
                add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));
                add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));
            }
        };
        
        System.out.println("所有java程序员的姓名");
        javaProgrammers.forEach((p)->System.out.printf("%s %s;",p.getFirstName(),p.getLastName()));
        System.out.println("所有php程序员的姓名");
        phpProgrammers.forEach((p)->System.out.printf("%s %s;",p.getFirstName(),p.getLastName()));
        
        //Consumer是java8的函数式接口
        System.out.println("给程序员加薪5%");
        Consumer<Person> giveRaise = e->e.setSalary(e.getSalary()/100*5+e.getSalary());
        javaProgrammers.forEach(giveRaise);
        phpProgrammers.forEach(giveRaise);
        
        System.out.println("下面是月薪超过 $1,400 的PHP程序员:");
        phpProgrammers.stream()
                      .filter((p)->(p.getSalary()>1400))
                      .forEach((p)->System.out.printf("%s %s;",p.getFirstName(),p.getSalary()));
        
        //自定义filter
        //先自己定义好filter的内容 做为过滤用,下面直接用名称即可
        Predicate<Person> ageFilter = (p)->(p.getAge()>25);
        Predicate<Person> salaryFilter = (p)->(p.getSalary()>1400);
        Predicate<Person> genderFilter = (p)->(p.getGender().equals("female"));
        
        Consumer<Person> pConsumer = p->System.out.printf("%s %s; ",p.getFirstName(),p.getLastName());
        
        System.out.println("下面是年龄大于 24岁且月薪在$1,400以上的女PHP程序员:");
        phpProgrammers.stream().filter(ageFilter).filter(salaryFilter).filter(genderFilter)
                               .forEach(pConsumer);
        
        // 重用filters consumers
        System.out.println("年龄大于 24岁的女性 Java programmers:");
        javaProgrammers.stream().filter(ageFilter).filter(salaryFilter).filter(genderFilter)
                                .forEach(pConsumer);
        
        
        System.out.println("最前面的3个 Java programmers:");
        javaProgrammers.stream().limit(3).forEach(pConsumer);
        System.out.println("最前面的3个女性 Java programmers:");
        
        javaProgrammers.stream().filter(genderFilter).limit(3).forEach(pConsumer);
        
        //排序
        
        System.out.println("根据 name 排序,并显示前5个 Java programmers:");
        Comparator<Person> pNameCompare = (p1,p2)->(p1.getFirstName().compareTo(p2.getFirstName()));
        Comparator<Person> pSalartComparator = (p1,p2)->(p1.getSalary()-p2.getSalary());
        
        List<Person> sortedJavaProgramers = javaProgrammers
        		                            .stream()
        		                            .sorted(pNameCompare)
        		                            .limit(5)
        		                            .collect(Collectors.toList());
        sortedJavaProgramers.forEach(pConsumer);
        
        System.out.println("根据 salary 排序 Java programmers:");
        
        sortedJavaProgramers.stream().sorted(pSalartComparator).collect(Collectors.toList());
        
        sortedJavaProgramers.forEach(pConsumer);
        
        
        //min和max方法
        System.out.println("工资最低的java Programmer");
        Person pers = javaProgrammers.stream().min((p1,p2)->(p1.getSalary()-p2.getSalary())).get();
        
        System.out.printf("Name: %s %s; Salary: $%,d.", pers.getFirstName(), pers.getLastName(), pers.getSalary());
        
        System.out.println("工资最高的 Java programmer:");
        
       Person perMax = javaProgrammers.stream().max((p1,p2)->(p1.getSalary()-p2.getSalary())).get();
        
        System.out.printf("Name: %s %s; Salary: $%,d.", perMax.getFirstName(), perMax.getLastName(), perMax.getSalary());
        
        
        
        System.out.println("将 PHP programmers 的 first name 拼接成字符串:");
        
        String phpDevelopers = phpProgrammers.stream().map(Person::getFirstName).collect(Collectors.joining(" : "));//在进一步的操作中可以作为标记token
        System.out.println("phpDevelopers:  "+phpDevelopers);
        
        
        System.out.println("将 Java programmers 的 first name 存放到 Set:");
        
        Set<String> javaDevFirstName = javaProgrammers.stream().map(Person::getFirstName).collect(Collectors.toSet());
        javaDevFirstName.forEach(fp->System.out.printf("%s; ",fp));
        
        System.out.println("将 Java programmers 的 first name 存放到 TreeSet:");
        
        TreeSet<String> javaDevLasName = javaProgrammers.stream().map(Person::getLastName).collect(Collectors.toCollection(TreeSet::new));
        javaDevLasName.forEach(fp->System.out.printf("%s; ",fp));
        
        
        //Streams 还可以是并行的(parallel). Stream是对集合的包装
        System.out.println("计算付给 Java programmers 的所有money:");
        int totalSlary = javaProgrammers.parallelStream().mapToInt(p->p.getSalary()).sum();
        System.out.println("totalSalary is:"+totalSlary);
        
      //使用summaryStatistics方法获得stream 中元素的各种汇总数据。
      // 接下来,我们可以访问这些方法,比如getMax, getMin, getSum或getAverage:
        //计算 count, min, max, sum, and average for numbers
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        IntSummaryStatistics stats = numbers.stream().mapToInt((x)->x).summaryStatistics();
        System.out.println("List中最大的数字 : " + stats.getMax());
        System.out.println("List中最小的数字 : " + stats.getMin());
        System.out.println("所有数字的总和   : " + stats.getSum());
        System.out.println("所有数字的平均值 : " + stats.getAverage());
        
        
        
        
        

	}

}




















package com.delta.lambdaTest;

public class Person {
	private String firstName, lastName, job, gender;
    private int salary, age;

    public Person(String firstName, String lastName, String job,
                  String gender, int age, int salary)       {
        this.firstName = firstName;
        this.lastName = lastName;
        this.gender = gender;
        this.age = age;
        this.job = job;
        this.salary = salary;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值