JDK8之Lambda表达式学习笔记

Lambda表达式体验

FilterStudentByAge.java

/**
 ******************************************************
 * 作者:唐鹏飞
 * 备注:
 * 时间:2017年3月24日上午10:37:57
 * Copyright (c) 2017, 243813208@qq.com All Rights Reserved.
 ******************************************************
 */

package com.mrt.demo;
/**
 * 类名:FilterStudentByAge 
 * 备注:	 
 * 时间:2017年3月24日 上午10:37:57
 * 作者:唐鹏飞
 * @since  	JDK 1.8	 
 */
public class FilterStudentByAge implements MyPredicate<Student> {

	@Override
	public boolean check(Student s) {
		return s.getAge()>17;
	}

}

FilterStudentByName.java

/**
 ******************************************************
 * 作者:唐鹏飞
 * 备注:
 * 时间:2017年3月24日上午10:37:57
 * Copyright (c) 2017, 243813208@qq.com All Rights Reserved.
 ******************************************************
 */

package com.mrt.demo;
/**
 * 类名:FilterStudentByAge 
 * 备注:	 
 * 时间:2017年3月24日 上午10:37:57
 * 作者:唐鹏飞
 * @since  	JDK 1.8	 
 */
public class FilterStudentByName implements MyPredicate<Student> {

	@Override
	public boolean check(Student s) {
		return s.getName().length()>3;
	}

}

LambdaDemo.java

/**
 ******************************************************
 * 作者:唐鹏飞
 * 备注:该工程主要演示Lambda用法
 * 时间:2017年3月24日上午9:08:51
 * Copyright (c) 2017, 243813208@qq.com All Rights Reserved.
 ******************************************************
 */
package com.mrt.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

import org.junit.Test;

/**
 * 类名:LambdaDemo 
 * 备注:	 Lambda示例
 * 时间:2017年3月24日 上午9:08:51
 * 作者:唐鹏飞
 * @since  	JDK 1.8	 
 */
public class LambdaDemo {
	/**
	 * 方法名:test1
	 * 备注:不使用Lamdba表达式时,TreeSet的用法
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午9:16:16
	 * @since JDK 1.8
	 */
	public void test1(){
		Comparator<String> com = new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return Integer.compare(o1.length(), o2.length());
			}
		};
		TreeSet<String> ts = new TreeSet<>(com);
		/*匿名内部类形式*/
		TreeSet<String> ts2 = new TreeSet<>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return Integer.compare(o1.length(), o2.length());
			}
		});
	}
	/**
	 * 方法名:test1OfLambda
	 * 备注:使用Lambda表达式简化test01方法
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午9:20:59
	 * @since JDK 1.8
	 */
	public void test1OfLambda(){
		Comparator<String> com = (x,y) -> Integer.compare(x.length(), y.length());
		TreeSet<String> ts = new TreeSet<>(com);
		
	}
	
	List<Student> students = Arrays.asList(
			new Student("李磊", 18),
			new Student("韩梅梅",18),
			new Student("Lucy", 17),
			new Student("Lily", 16),
			new Student("Polly", 2)
			);
	
	/**
	 * 方法名:filterStudentByAge
	 * 备注:获取年龄小于17岁的人的名字
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午9:26:17
	 * @since JDK 1.8
	 */
	public List<Student> filterStudentByAge(List<Student> s){
		List<Student> list = new ArrayList<>();
		for (Student student : s) {
			if(student.getAge() < 17){
				list.add(student);
			}
		}
		return list;
	}
	/**
	 * 方法名:filterStudentByName
	 * 备注:获取名字长度大于3的学生
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午9:49:56
	 * @param s
	 * @return
	 * @since JDK 1.8
	 */
	public List<Student> filterStudentByName(List<Student> s){
		List<Student> list = new ArrayList<>();
		for (Student student : s) {
			if(student.getName().length() > 3){
				list.add(student);
			}
		}
		return list;
	}
	@Test
	public void test02(){
		List<Student> list = this.filterStudentByAge(students);
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("------------------------------------");
		list = this.filterStudentByName(students);
		for (Student student : list) {
			System.out.println(student);
		}
	}
	
	//优化方式一:策略设计模式
	/**
	 * 方法名:filterStudent
	 * 备注:使用策略设计模式进行优化,将过滤规则定义为一个接口,
	 * 通过传入不同的实现类达到不同的过滤效果
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午10:36:21
	 * @param s
	 * @param mp
	 * @return
	 * @since JDK 1.8
	 */
	public List<Student> filterStudent(List<Student> s,MyPredicate<Student> mp){
		List<Student> list = new ArrayList<>();
		for (Student student : s) {
			if(mp.check(student)){
				list.add(student);
			}
		}
		return list;
	}
	
	@Test
	public void test03(){
		List<Student> list = this.filterStudent(students, new FilterStudentByAge());
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("=================================");
		list = this.filterStudent(students,new FilterStudentByName());
		for (Student student : list) {
			System.out.println(student);
		}
	}
	
	//使用匿名内部类形式优化
	/**
	 * 方法名:test03OfInnerClass
	 * 备注:使用匿名内部类优化
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午10:45:53
	 * @since JDK 1.8
	 */
	public void test03OfInnerClass(){
		List<Student> list = this.filterStudent(students, new MyPredicate<Student>() {
			@Override
			public boolean check(Student t) {
				return t.getAge() < 17;
			}
		});
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("=================================");
		list = this.filterStudent(students, new MyPredicate<Student>() {
			@Override
			public boolean check(Student t) {
				
				return t.getName().length() > 3;
			}
		});
		for (Student student : list) {
			System.out.println(student);
		}
	}
	
	//使用Lambda表达式优化
	/**
	 * 方法名:test03OfLambda
	 * 备注:使用Lambda表达式进行代码优化
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午10:51:02
	 * @since JDK 1.8
	 */
	public void test03OfLambda(){
		List<Student> list = this.filterStudent(students, e -> e.getAge() < 17);
		for (Student student : list) {
			System.out.println(student);
		}
		System.out.println("=================================");
		list = this.filterStudent(students, e -> e.getName().length() > 3);
		for (Student student : list) {
			System.out.println(student);
		}
	}
	//使用StreamAPI进行优化
	/**
	 * 方法名:test03OfStream
	 * 备注:使用StreamAPI进行代码优化
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日上午10:52:40
	 * @since JDK 1.8
	 */
	@Test
	public void test03OfStream(){
		students.stream()
			.filter(e -> e.getAge() < 17)
			.forEach(System.out::println);
		System.out.println("=================================");
		students.stream()
				.filter(e -> e.getName().length() > 3)
				.forEach(System.out::println);
	}	

}

MyPredicate.java

/**
 ******************************************************
 * 作者:唐鹏飞
 * 备注:
 * 时间:2017年3月24日上午10:34:01
 * Copyright (c) 2017, 243813208@qq.com All Rights Reserved.
 ******************************************************
 */

package com.mrt.demo;
/**
 * 类名:MyPredicate 
 * 备注:	 
 * 时间:2017年3月24日 上午10:34:01
 * 作者:唐鹏飞
 * @since  	JDK 1.8	 
 */
public interface MyPredicate<T> {
	
	public boolean check(T t);

}

Student.java

/**
 ******************************************************
 * 作者:唐鹏飞
 * 备注:
 * 时间:2017年3月24日上午9:22:58
 * Copyright (c) 2017, 243813208@qq.com All Rights Reserved.
 ******************************************************
 */

package com.mrt.demo;
/**
 * 类名:Student 
 * 备注:	 
 * 时间:2017年3月24日 上午9:22:58
 * 作者:唐鹏飞
 * @since  	JDK 1.8	 
 */
public class Student {
	private String name;
	private int age;
	
	public Student() {}
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
}

 

Lambda表达式简介:

    Lambda表达式是JDK8中一个很重要的特性。可以将Lambda表达式理解为一段可以传递的代码(将代码块当做参数一样传递),这样可以写出更加简洁、灵活的代码。

 

Lambda表达式语法及示例:

/**
 ******************************************************
 * 作者:唐鹏飞
 * 备注:演示Lambda表达式语法
 * 时间:2017年3月24日上午11:28:58
 * Copyright (c) 2017, 243813208@qq.com All Rights Reserved.
 ******************************************************
 */

package com.mrt.demo01;
import java.util.function.Consumer;
import java.util.function.Function;

import org.junit.Test;

/**
 * 类名:LambdaDemo 
 * 备注:	 
 * Lambda语法
 * Java8中引入一个新的操作运算符:"->",这个符号被称之为箭头,也被称之为Lambda运算符。
 * Lambda可以理解为一段可以传递的代码块。甚至一个匿名方法。
 * 将代码当做参数一样进行传递。这样的代码更加紧凑,灵活。
 * 
 * ***********************************************************************
 * 在一定程度上说,Lambda表达式是匿名内部类的一种替代品,不过Lambda表达式依赖函数式接口。
 * 什么是函数式接口:
 * 		函数式接口是指只有一个抽象方法的接口。可以使用注解@FunctionInterface进行修饰的接口。
 * 		被这个注解修饰的接口只能有一个抽象方法。
 * 在Java8中提供了四大核心函数接口,其有子接口,分别是:
 * 		接口名称						抽象方法
 * 		Consumer<T>:消费型接口       	void accept(T t)
 * 		Supplier<T>:供给型接口			T get()
 * 		Function<T,R>:函数型接口		R apply(T t);
 * 		Predicate<T>:断言型接口		boolean test(T t)
 * 	其衍生的子接口可以参考文档
 * 
 *  * ***********************************************************************
 * 
 * Lambda运算符将表达式分为2块。->的左边、->的右边
 * ->左边:是Lambda表达式的参数列表
 * ->右边:是Lambda的具体代码块,也被称之为Lambda体
 * 因为将Lambda理解为一个匿名方法的话,因为参数与返回值得关系,Lambda衍生出以下几种语法格式:
 * 语法格式一:
 * 		无参数,无返回值
 * 		() -> { 代码块 }
 * 		注意:当代码块中只有一行代码时可以缺省大括号
 * 语法格式二:
 * 		有参数,无返回值
 * 		(参数1,参数二,...,参数n) -> {代码块}
 * 		注意:
 * 		当参数只有一个时,可以缺省小括号;当代码块只有一行时,可以缺省大括号
 * 语法格式三:
 * 		有参数,有返回值
 * 		(参数1,...,参数n) -> {代码块 ;return 值;}
 * 		注意:
 * 		当参数只有一个时,可以缺省大括号;当代码块中算上返回值只有一行时,可以缺省大括号及return
 * 
 * 
 * * ***********************************************************************
 * 时间:2017年3月24日 上午11:28:58
 * 作者:唐鹏飞
 * @since  	JDK 1.8	 
 */
public class LambdaDemo {
	/**
	 * 方法名:test01
	 * 备注:演示Lambda表达式第一种语法格式
	 * 		无参数  无返回值
	 * 		()->{代码块}
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日下午2:23:30
	 * @since JDK 1.8
	 */
	@Test
	public void test01(){
		Thread t = new Thread(()->{
			for(int i=0;i<10;i++){
				System.out.println(i);
			}
			System.out.println("我实现的Runnable的run方法");}
		);
		t.start();
		System.out.println("===============如果使用内部类形式===================");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<10;i++){
					System.out.println(i);
				}
				System.out.println("我实现的Runnable的run方法");
			}
		});
		t2.start();
	}
	/**
	 * 方法名:test02
	 * 备注:演示Lambda表达式第二种语法格式
	 * 	有参数,无返回值
	 * 	(参数1,参数2,...,参数n) ->{代码块}
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日下午2:28:31
	 * @since JDK 1.8
	 */
	@Test
	public void test02(){
		Consumer<String> con = x -> System.out.println(x);
		con.accept("我演示的是有参数无返回值,此时为了方便直接使用的JDK提供的消费型接口\n"
				+ "无需自己定义接口,且一个参数,一行代码省略了相应的括号");
		System.out.println("===============如果使用内部类形式===================");
		Consumer<String> con2 = new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println(t);
			}
		};
		con2.accept("看着确实比匿名内部类更加精简");
		
	}
	/**
	 * 方法名:test03
	 * 备注:演示Lambda表达式第三种语法格式
	 * 有参数,有返回值
	 * (参数1,参数2,...,参数n) ->{代码块;return 值;}
	 * 作者:唐鹏飞
	 * 时间:2017年3月24日下午2:35:43
	 * @since JDK 1.8
	 */
	@Test
	public void test03(){
		Function<String,String> fun = x -> {x=x + "演示的是有参数有返回值类型的语法格式,"
				+ "返回值是拼接后生成的心的字符串,参数是传进来的x字符串";return x;};
		System.out.println(fun.apply("为方便直接使用的是函数类型接口\n其他接口类型就不再演示了。"
				+ "原理类似,语法需要自己细细体会"));
		System.out.println("===============如果使用内部类形式===================");
		Function<String,String> fun2 = new Function<String, String>() {

			@Override
			public String apply(String t) {
				return "这种新的语法格式需要习惯,用多了就好了";
			}
		};
		System.out.println(fun2.apply("与之前Java的代码风格确实有很大变化,但是只需要习惯"));
		
	}

}

 

转载于:https://my.oschina.net/u/3121956/blog/866118

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值