文档章节

JDK8之Lambda表达式学习笔记

妄知天命
 妄知天命
发布于 2017/03/24 11:45
字数 2317
阅读 223
收藏 0

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的代码风格确实有很大变化,但是只需要习惯"));
		
	}

}

 

© 著作权归作者所有

妄知天命
粉丝 3
博文 8
码字总数 4465
作品 0
武汉
私信 提问
看看 JDK 8 给我们带来什么

世界的变化虽然缓慢但一直在变。继JDK 7给java一个全新的面貌之后,java社区就一直期盼着java剩余的全部改进空间可以伴随着JDK 8甚至很可能是JDK 9的诞生而消失。JDK 8的目标是填补JDK 7存在...

oschina
2013/01/07
43.6K
38
Java 8 lambda表达式

1、在JDK8之前,Java是不支持函数式编程的 函数编程,即可理解是将一个函数(也称为“行为”)作为一个参数进行传递 面向对象编程是对数据的抽象(各种各样的POJO类) 函数式编程则是对行为的...

职业搬砖20年
2018/06/07
21
0
使用JDK8新特性重构你的代码

lambda 表达式 当一个接口只有一个方法的时候都可以使用lambda 表达式代替 这种称为函数接口可以用 @FunctionalInterface 修饰 lambda 表达式多种形式 使用lambda表达式实现设计模式 这里我们...

12叔
2016/04/15
629
0
屌炸天,JDK8的排序大法!!

首先祝大家端午节快乐! 今天总结了下JDK中排序的方法,包括JDK8中强大的lambda表达式及函数式接口运用,不废话,请看下面示例。 public class Test { public static void main(String[] arg...

java技术栈
2017/08/13
0
0
JDK8新特性(1):Lambad表达式

Lambda表达式: jdk8前,达到lambda效果的实现方案是使用匿名方法的方式来实现 new NamedParameterJdbcTemplate(jdbcTemp).query(selSql, parameters, new RowMapper<String>() { }); jdbcT......

arthur666
2017/10/21
131
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
12
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部