java8新特性

java SE8重要性能:

  • Lambda
  • Nashorn JavaScript引擎
  • 新的日期与时间API
  • 一套简洁的配置文件
  • 从JVM中去除了永久代
  • 增强的注解功能

接口

  1. 增加了default方法 和 static方法 都可以有方法体
  2. default 方法属于实例,static方法属于(接口)
  3. 接口里面的静态方法不会被继承,静态变量会被继承
  4. 一个类实现多个接口,且这些接口互相之间没有继承关系,会报错。
    有继承关系,子接口会重写父接口的同名方法
  5. 有多个继承,有相同方法,实现类中可以通过特殊的语法指定要访问哪个接口的方法,在实现类中重写默认方法,在方法里面写
    <接口>.super.<方法名>
	interface InterTest1 {
		static void test1(){
			System.out.println("接口静态方法执行。。。");
		}
		default void test2(){
			System.out.println("接口InterTest1默认方法执行。。。");
		}
	}
	interface InterTest2{
		default void test2(){
			System.out.println("接口InterTest2默认方法执行。。。");
		}
	}
	class InterMainTest implements InterTest2,InterTest1{
		@Override
		public void test2() {
			InterTest2.super.test2();
		}
	}
  1. 如果接口只有一个方法,接口是一个函数式接口,可以使用lambda表达式。
  2. 如果接口里面使用@FunctionalInterface 注解,限定接口里面只能有一个抽象方法。
	@FunctionalInterface
	interface InterTest{
		void test1();
	}

Lambda表达式

函数式接口

当接口里面只有一个抽象方法时,就是函数式接口,可以使用@FunctionalInterface注解强制限定接口只能有一个抽象方法
注解:从java5开始引入注解,利用注解对字节码文件进行一些说明
lambda表达式只能对函数式接口使用

Lambda表达式语法
  • 参数列表 ()
  • 箭头符号“->”
  • 代码块 {}
package top.yuzktyu.java8.lambda;
/*
* @author yuzk
* @date 2018年10月27日 下午3:56:43
* @version 1.0
*/
public class LambdaTest {
	public static void main(String[] args) {
		// 匿名内部类方法
		LambdaInterface li = new LambdaInterface() {
			public void test(){
				System.out.println("匿名内部类实现");
			}
		};
		li.test();
		// lambda 表达式实现
		LambdaInterface li2 = () ->{
			System.out.println("使用Lambda表达式实现");
		};
		li2.test();
		// lambda 表达式简便方法
		// 方法体只有一句话  可以省略大括号  以及省略一个分号
		// 如果有返回值  return 也能省略
		LambdaInterface li3 =()-> System.out.println("使用Lambda表达式简便方法实现");
		li3.test();
		
		// 有参数
		// 参数不需要知道数据类型
		LambdaInterface2 li21 = (x)->{
			System.out.println("一个参数输出参数"+x);
		};
		li21.test(6);
		// 简便方法  参数列表只有一个参数  可以省略圆括号
		LambdaInterface2 li22 = x-> System.out.println("一个参数输出参数简便方法"+x);
		li22.test(6);
		
		LambdaInterface3 li31 = (i,j)->{
			System.out.println("两个参数"+i+"..."+j);
		};
		li31.test(5, 5);
		// 有返回值的方法
		LambdaInterface4 li41 = (b)->{
			b=b+10;
			return b;
		};
		System.out.println(li41.test(30));
		// 简便方法
		LambdaInterface4 li42 = b-> b+10;
		System.out.println(li42.test(10));
	}
}
// 没有参数没有返回值
interface LambdaInterface{
	void test();
}
// 一个参数 没有返回值
interface LambdaInterface2{
	void test(int i);
}
// 两个参数 没有返回值
interface LambdaInterface3{
	void test(int i,int j);
}
// 一个参数 有返回值
interface LambdaInterface4{
	int test(int i);
}

函数参数

package top.yuzktyu.java8.lambda;

import com.sun.org.apache.regexp.internal.recompile;

/*
* @author yuzk
* @date 2018年10月27日 下午4:37:48
* @version 1.0
*/

public class LambdaReturnTest {
	void re(LambdaReturn lr){
		int i = lr.test();
		System.out.println("返回值"+i);
	}
	public static void main(String[] args) {
		LambdaReturnTest lrt = new LambdaReturnTest();
		lrt.re(()->{return 14;});
		lrt.re(()->14);
 	}
}
interface LambdaReturn{
	int test();
}


Stream流

  1. Stream 在java8中被定义为泛型接口
  2. Stream 接口代表数据流
  3. Stream 不是一个数据结构,不直接存储数据
  4. Stream 通过管道操作数据
  5. 创建Stream 接口实现类对象
Stream<Person> stream = people.stream(); 

创建一个元素为Person的集合:people 使用Stream和forEach 显示该集合所有元素。

public class StreamTest {
	static List<Person> createPeople(){
		List<Person> list = new ArrayList<>();
		Person p1 = new Person("张飞",48,Person.Sex.MAIL,1.8);
		Person p2 = new Person("刘备",32,Person.Sex.MAIL,1.7);
		Person p3 = new Person("关羽",45,Person.Sex.MAIL,1.9);
		Person p4 = new Person("诸葛亮",34,Person.Sex.MAIL,1.6);
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		return list;
	}
	public static void main(String[] args) {
		List<Person> people = createPeople();
		Stream<Person> stream = people.stream();
		stream.forEach(p->System.out.println(p.toString()));
	}
}

管道

  1. 管道代表一个操作序列
  2. 管道包含以下组件
    • 数据集 :可能是集合、数组等
    • 零个或多个中间业务。如过滤器
    • 一个终端操作,如 forEach

过滤器

  1. 过滤器:用给定的条件在源数据基础上过滤出新数据,并返回一个Stream对象。
  2. 过滤器包含匹配的谓词。
  • 例如:判断p对象是否为男性的lambda表达式:
    Stream<Person> stream = people.stream();
    stream = stream.filter(p->p.getGender()=='男');
    

创建一个元素为Person的集合:people 使用Stream和forEach 显示该集合所有元素。

public class FilterTest {
	public static void main(String[] args) {
		List<Person> people = createPeople();
		people.stream()
			.filter(p->p.getGender()==Person.Sex.FEMALE)
			.forEach(p->System.out.println(p));
	}
	static List<Person> createPeople(){
		List<Person> list = new ArrayList<>();
		Person p1 = new Person("张飞",48,Person.Sex.MAIL,1.8);
		Person p2 = new Person("刘备",32,Person.Sex.MAIL,1.7);
		Person p3 = new Person("关羽",45,Person.Sex.MAIL,1.9);
		Person p4 = new Person("小乔",34,Person.Sex.FEMALE,1.6);
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		return list;
	}
}

DoubleStream接口

  1. DoubleStream接口表示元素类型是double的数据源
  2. DoubleStream的常用方法
    • streammax().getAsDouble():获取流中数据集的最大值
    • stream.min().getAsDouble():获取流中数据集的最小值
    • stream.average().getAsDouble(): 获取流中数据集的平均值
list.stream()
.filter(p->p.get*==*)
.mapToDouble(p->p.get*)
.average()
.getAsDouble();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值