java8新特征
一:Lambda 表达式
为什么使用 :使用 Lambda 表达式可以使代码变的更加简洁紧凑。
表达了什么?: 匿名内部类的新写法;
语法 :(parameters) -> expression 或 (parameters) ->{ statements; }
parameters 对应接口的参数例如
expression或statements : 对应接口的实现
假设需求:一个类的方法参数是一个接口类型的,而又没有相关的该接口的实现。
接口如下
public interface MyInterface {
void toDo();
}
1): 最不简洁的写法
public class Java8Lambda {
private void toDo(MyInterface myInterface) {
myInterface.toDo();
}
public static void main(String[] args) {
Java8Lambda lambda = new Java8Lambda();
MyInterfaceImpl interfaceImpl = new Java8Lambda().new MyInterfaceImpl();
lambda.toDo(interfaceImpl);
} class MyInterfaceImpl implements MyInterface{ @Override
public void toDo() {
System.out.println("我仅是打印一句话,但要写一个类出来,好麻烦!!!"); } }
}
2):java8之前的写法(匿名内部类)
public static void main(String[] args) {
Java8Lambda java8Lambda = new Java8Lambda();
java8Lambda.toDo(new MyInterface() { @Override
public void toDo() {
System.out.println("我是匿名内部类的写法,虽然简洁,但还不比lambda表达式简介");
}
}); // Java8Lambda lambda = new Java8Lambda();
// MyInterfaceImpl interfaceImpl = new Java8Lambda().new MyInterfaceImpl();
// lambda.toDo(interfaceImpl); }
3): lambda表达式(是不是很简洁^_^)
public static void main(String[] args) {
Java8Lambda java8Lambda = new Java8Lambda();
java8Lambda.toDo(() -> {System.out.println("我是lambda表达式写法");});
}
备注:
二:Stream (流:新的api)
简洁:类似io流中的流概念(个人理解:这个流是对外部资源的读取操作如网络资源或文件),而新的流Stream主要是对内部数据建立流(主要是集合数据),并进行读取操作。主要是利用lambda表达式对集合数据进行操作,相比以前操作集合这种写法代码更简洁。
1): 通过集合生成Stream 对象
在java8新版本中对接口(interface)特性添加了一些新的特性(这些特性有的与之前我们的认识可能不同),例如接口中的方法可以有具体实现(之前是的能的),但必须通过关键字default修饰,而且该方法不用被子类实现。
好处:这样我们可以给之前定义的接口添加新的方法,而不必修改继承他的所有子类(以前如果我们给一个接口添加新的方法,就必须给所有继承该接口的所有子类添加该方法)。可以很容易扩展之前定义接口的方法。
用例:在java8中,给Collection接口定义了一个新的实现方法 stream() ,该方法可以生产Stream 对象。
List<String> list = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Stream<String> stream2 = list.stream();
备注:用Stream对象很大一部分用处也是为支持lambda,写出更简洁的代码而设计的,当然用stream对象对操作集合(list)有时比传统方法更高效。比如遍历集合中的数据,就比for()遍历更高效。
2) : 常用接口
* forEach 参数(Consumer<? super String> action)
遍历流对象并打印所有结果
* map (Function)
用于映射集合中的每个数据
* filter(Predicate)
顾名思义用于过滤集合中符合条件的数据
* limit(int )
用于获取指定数量的流
* sorted (Comparator) 和sorted () 无参数
顾名思义对集合中的数据排序
备注:以上操作都不会影响原始集合中的数据。即他们返回一个新的集合
备注:java8,定义了一个新的接口类型叫@FunctionalInterface函数接口,即该接口中只能有一个抽象方法(可以有实现的方法)
以上集合中的参数都是函数接口(除limit方法)
三:举例
主要是想演示使用stream对象api的与lambda表达式结合使用,以及验证我前面说的Lambda 表达式是匿名内部类的新写法。(我们知道内部类通过javac编译后会生成以外部类和内部类结合的文件,其实lambda表达式也会生成响应的文件)。
public static void main(String[] args) {
List<String> list = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Stream<String> stream = list.stream();
//通过匿名内部类写法 过滤集合中的空值
Stream<String> filter = stream.filter(new Predicate<String>() {
public boolean test(String t) {
return !t.isEmpty();
}
});
//通过匿名内部类写法 遍历集合中的数据
filter.forEach(new Consumer<String>() {
public void accept(String t) {
System.out.println(t);
}
});
////////////////////////////////////////////////////////////////////////////////////////////
//lambda写法
List<String> list2 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Stream<String> stream2 = list2.stream();
// 对比匿名内部 过滤集合
Stream<String> stream3 = stream2.filter(string -> !string.isEmpty());
// 对比匿名内部 遍历集合
stream3.forEach( t -> System.out.println(t));
}
java8新特征的更多相关文章
- java8新特性全面解析
在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...
- Java8新特性
Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...
- Java8 新特性Stream 的学习和使用方法
流(Stream) 流是java 8 中新引入的特性,用来处理集合中的数据,Stream 是一个来自数据源的元素队列并支持聚合操作. Java 中 Stream 不会存储元素. 数据源 流的来源. 可 ...
- java7和java8新特性
以下来至网址: http://blog.csdn.net/samjustin1/article/details/52268004 Java7 新特性 1.switch中可以使用字符串了 String ...
- 2020你还不会Java8新特性?
Java8(1)新特性介绍及Lambda表达式 前言: 跟大娃一块看,把原来的电脑拿出来放中间看视频用 --- 以后会有的课程 难度 深入Java 8 难度1 并发与netty 难度3 JVM 难度4 ...
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...
- Java线程新特征——Java并发库
一.线程池 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...
- Java多线程-新特征-阻塞队列ArrayBlockingQueue
阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素 ...
- 利用GBDT模型构造新特征具体方法
利用GBDT模型构造新特征具体方法 数据挖掘入门与实战 公众号: datadw 实际问题中,可直接用于机器学**模型的特征往往并不多.能否从"混乱"的原始log中挖掘到有用的 ...
随机推荐
- Canvas中如何画一条清晰的线宽为奇数(如1px逻辑像素)的线?
我在开发中使用canvas的机会不是很多,但是第一次实际使用中就遇到了问题,"很久很久以前,我自己画了一个雷达图,线宽都是1像素,但是显示效果不如期望,这才发现canvas中的画线还是有坑的 ...
- .net core 2.x - docker(for windows)-linux配置及项目+SqlServer发布
将.net core2.x+sqlserver项目发布到docker.呵呵,操作很自如,如下. 1.罗嗦几句 在跑起来之前浪费了不少时间和精力,起初是将docker for windows的环境转换成 ...
- golang项目git-subtree完美解决差异包管理
目标: 1.把golang官方已移动过url的包跟随自己的项目git代码上传到项目源码中. 2.把或自己修改过的差异化fork包跟随自己的项目git代码上传到项目源码中. 解决方案: 方案1.第三方包 ...
- RESTful-2一分钟理解什么是REST和RESTful
从事web开发工作有一小段时间,REST风格的接口,这样的词汇总是出现在耳边,然后又没有完全的理解,您是不是有和我相同的疑问呢?那我们一起来一探究竟吧! 就是用URL定位资源,用HTTP描述操作. 知 ...
- python案例——体脂率项目
通过一个人的身高.体重.年龄.性别,判断这个人的体脂率,并且反馈是否正常? 首先接到项目后一定要一步步细分任务,直到每个细分的任务都可以用代码来实现. 写代码之前,先要确定python版本的问题 然后 ...
- python之socketserver实现并发
python之socketserver实现并发 服务端 import socketserver #socketserver模块是用来实现并发 # 我们自己的类里一定要继承socketserver.Ba ...
- net view ERROR 6118
如上图,使用net view命令出现错误6118(server2012),谷歌百度油管解决了. 尝试1: 把Computer Browser服务打开.https://blog.csdn.net/qq_ ...
- 计蒜客 等边三角形 dfs
题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...
- PCB差分线学习
问:何为差分信号? 答:通俗地说,就是驱动端发送两个等值.反相的信号,接收端通过比较这两个电压的差值来判断逻辑状态“0”还是“1”. 问:差分线的优势在哪? 答:差分信号和普通的单端信号走线相比,最明 ...
- 无线路由WMM,Short GI,AP隔离功能介绍(转)
无线路由器中有开启WMM.开启Short GI和开启AP隔离分别代表什么呢?这是我在我的TP-LINK无线路由器TL-WR841N中的无线高级设置中看到的三个选项,下面三点对这三项无线高级设置做了下解 ...