jdk1.8新特性浅讲

接口的新特性

默认方法和静态方法

jdk1.8在接口中新增了默认方法和默认方法, 避免了一些项目改动造成重构带来的巨大消耗, 它是一种兼容性的解决方案, 主要是针对项目在运行期间改动的需求.

代码分析

@FunctionalInterface
public interface Fightable {

	void fight();
	
	//jdk8新的特性, 默认方法
//	default void m() {
//		System.out.println("默认方法");
//	}
	
	//接口的默认方法实际上一种兼容性的解决方案, 项目已在运行期, 需要修改, 如果改动消耗比较大, 因此jdk1.8新增默认方法
	default void holder() {
		System.out.println("蓄力");
	}
	
	//静态方法不存在重写,与子类无关
	static void showPower() {
		System.out.println("攻击力10000");
	}
	
}

默认方法和静态方法的格式如上代码所展示的一样

函数式接口

这是一个新的概念, 当一个接口中只有一个实现的方法, 我们就可以叫这个接口为函数式接口, 可以在接口上面加上@FunctionalInterface注解,函数式接口主要为了jdk1.8新增的lambda表达式铺路的;

Lambda表达式

什么是Lambda表达式

Lambda表达式是针对函数接口在匿名内部类中的特殊写法,它是一种语法糖机制,可以大大优化我们的代码;

代码分析

@FunctionalInterface
public interface Animal {

	void eat(String food, String game);
	
}

public class TestAnimal {

	public static void main(String[] args) {

		Animal a = (food, game) -> {
			System.out.println("动物吃" + food + ", 玩" + game);
		};

		// 如果只有一行代码, 可以简化
		Animal a1 = (food, game) -> System.out.println("动物吃" + food + ", 玩" + game);

		a.eat("肉", "球");
		a1.eat("金坷垃", "球");

	}

}

从上面的代码可以发现, 如果我们使用Lambdab表达式,可以大大简化我们的代码, 其实它真正的用途也是在为jdk1.8的新特性的主角铺路的;

StreamAPI

简介

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

IntStream

主要是针对int数组的一种流处理

代码案例:

public class TestArray {

	public static void main(String[] args) {
		int[] i = new int[] { 4, 3, 6, 8, 7, 9, 5, 6, 2, 1, 10 };
		// 1.获取流
		IntStream is = Arrays.stream(i)
//		IntStream is = IntStream.of( 4, 3, 6, 8, 7, 9, 5, 6, 2, 1, 10)
		// 2. 中间处理
				// 排序
				.sorted()
				// 去重
				.distinct()
				// 跳过前5位
				.skip(5)
				// 截取前5位
				.limit(5);
		// 3. 结尾处理,只能处理一次
//		i = is.toArray();
//		System.out.println(Arrays.toString(i));
		//求和
//		System.out.println(is.sum());
		//平均值
//		System.out.println(is.average().getAsDouble());
		//最大值
//		System.out.println(is.max().getAsInt());
		//最小值
		//System.out.println(is.min().getAsInt());
//		is.forEach(a -> System.out.println(a));
		//方法引用
		is.forEach(System.out::println);
	}

}

集合Stream

List Set Stream

代码案例:
public class TestPeople {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		
		List<People> list = new ArrayList<>();
		list.add(new People(1011, "刘老师", "女", new Date(90, 12, 11), "湖北武汉"));
		list.add(new People(1012, "苍老师", "男", new Date(88, 12, 11), "湖北武汉"));
		list.add(new People(1031, "柴老师", "女", new Date(86, 12, 11), "湖北武汉"));
		list.add(new People(1411, "张老师", "男", new Date(92, 12, 11), "湖北武汉"));
		list.add(new People(1051, "陈老师", "女", new Date(91, 12, 11), "湖北武汉"));
		list.add(new People(1051, "陈老师", "女", new Date(91, 12, 11), "湖北武汉"));
		list.add(new People(1411, "李老师", "男", new Date(87, 12, 11), "湖北武汉"));
		list.add(new People(1071, "孙老师", "男", new Date(89, 12, 11), "湖北孝感"));
		list.add(new People(1511, "刘老师", "女", new Date(94, 12, 11), "湖北武汉"));
		list.add(new People(1081, "好老师", "男", new Date(84, 12, 11), "湖北武汉"));
		list.add(new People(1611, "刘老师", "女", new Date(99, 12, 11), "湖北武汉"));
		//1. 获取流
		Stream<People> stream = list.stream()
		//2.中间处理
		.sorted((p1, p2) -> p1.getId() - p2.getId())
		.skip(2)	//跳过2条
		.limit(5)	//截取5条
		.filter(p-> Objects.equals("湖北武汉", p.getJiguan()))
		.filter(p -> Objects.equals("女", p.getSex()))
		.distinct();  //去出重复, 前提是要重写equals方法
		//将姓名取出转换成另外的流
//		Stream<String> stream2 = stream.map(p -> p.getName());
//		//List<String> names = stream2.collect(Collectors.toList());
//		stream2.forEach(System.out::println);
		//3.结尾处理, 返回值不是Stream的方法
		//lambda达表示
		//stream.forEach(System.out::println);
		//stream.forEach(p -> System.out.println(p));  //和上面一样
		//统计
//		System.out.println(stream.count());
		
		//max 年龄 和.get()一起用
//		People p = stream.max((p1, p2) -> p2.getBirth().compareTo(p1.getBirth())).get();
//		System.out.println(p);
		
		List<People> newL = stream.collect(Collectors.toList());
		newL.forEach(System.out::println);
	}
	
}

Map Stream

代码案例:
public class TestMap {

	public static void main(String[] args) {

		Map<String, Object> map = new HashMap<>();
		map.put("html", "HyperTextMakup Language");
		map.put("css", "Cascading Style Sheets");
		map.put("js", "JavaScript");
		map.put("bs", "Bootstrap");
		map.put("ssh", "Spring Struts2 Hibernate");
		map.put("ssm", "Spring SpringMVC MyBatis");
		map.put("xml", "Extension markup Language");

//		map.forEach((k, v)->System.out.println(k + "-->" + v));
		map.entrySet().stream().filter(e -> e.getKey().toLowerCase().contains("s"))
				.sorted((e1, e2) -> e1.getValue().toString().length() - e2.getValue().toString().length())
				.filter(e -> e.getKey().length() >= 3).skip(1).map(e -> e.getValue()) // 映射,取出value的值形成新的Stream
				.collect(Collectors.toList()).forEach(System.out::println);

	}

}

总结

jdk新增的一些新特性还是挺实用的,特别是StreamAPI, 在实际编程中可以大大提高我们的效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值