JDK8新特性面试
java8:http://ifeve.com/java-8-features-tutorial/
一、Lambda表达式和函数式接口
Lambda表达式(也叫做闭包)
它允许我们将一个函数当作方法的参数(传递函数),或者说把代码当作数据
Lambda表达式可以用逗号分隔的参数列表、->符号和功能语句块来表示
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
编译器会根据上下文来推测参数的类型,或者你也可以显示地指定参数类型,只需要将类型包在括号里
Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );
如果Lambda的功能语句块太复杂,可以用大括号包起来
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );
Lambda表达式可能会引用类的成员或者局部变量(会被隐式地转变成final类型)
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );
等价于
final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );
Lambda表达式可能会有返回值,编译器会根据上下文推断返回值的类型
如果lambda的语句块只有一行,不需要return关键字
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
等价于
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
int result = e1.compareTo( e2 );
return result;
} );
函数接口是一种只有一个方法的接口,像这样地,函数接口可以隐式地转换成lambda表达式。
Java 8提供了一个特殊的注解@FunctionalInterface来克服脆弱性并且显示地表明函数接口的目的
注意: 默认的方法和静态方法(下一节会具体解释)不会违反函数接口的约定
@FunctionalInterface
public interface FunctionalDefaultMethods {
void method(); default void defaultMethod() {
}
}
2、 接口的默认方法和静态方法
Java 8增加了两个新的概念在接口声明的时候:默认和静态方法。
默认方法和Trait有些类似,但是目标不一样。
默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的
实现类都会通过继承得倒这个方法(如果有需要也可以重写这个方法)
Java 8 的另外一个新特性是接口里可以声明静态方法,并且可以实现
 private interface DefaulableFactory {
     // Interfaces now allow static methods
     static Defaulable create( Supplier< Defaulable > supplier ) {
         return supplier.get();
     }
 }
接口的静态方法和默认方法放在一起的示例,::new 是构造方法引用
 public static void main( String[] args ) {
     Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
     System.out.println( defaulable.notRequired() );
     defaulable = DefaulableFactory.create( OverridableImpl::new );
     System.out.println( defaulable.notRequired() );
 }
java 8支持的4种方法引用
 public static class Car {
     public static Car create( final Supplier< Car > supplier ) {
         return supplier.get();
     }             
     public static void collide( final Car car ) {
         System.out.println( "Collided " + car.toString() );
     }
     public void follow( final Car another ) {
         System.out.println( "Following the " + another.toString() );
     }
     public void repair() {
         System.out.println( "Repaired " + this.toString() );
     }
 }
第一种方法引用是构造方法引用,语法是:Class::new ,对于泛型来说语法是:Class<T >::new,请注意构造方法没有参数:
final Car car = Car.create( Car::new );final List< Car > cars = Arrays.asList( car );第二种方法引用是静态方法引用,语法是:Class::static_method请注意这个静态方法只支持一个类型为Car的参数。
第三种方法引用是类实例的方法引用,语法是:Class::method请注意方法没有参数。
最后一种方法引用是引用特殊类的方法,语法是:instance::method,请注意只接受Car类型的一个参数。
final Car police = Car.create( Car::new );4 重复注释
Java 8引入了重复注释,允许相同注释在声明使用的时候重复使用超过一次
Optional
Optional< String > fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
如果Optional实例有非空的值,
方法 isPresent() 返回true否则返回false。
方法orElseGet提供了回退机制,当Optional的值为空时接受一个方法返回默认值。
map()方法转化Optional当前的值并且返回一个新的Optional实例。
orElse方法和orElseGet类似,但是它不接受一个方法,而是接受一个默认值
Stream
Stream是多个元素的序列,支持串行和并行操作。
Stream操作被分为中间操作和终点操作
中间操作返回一个新的Stream。这些中间操作是延迟的,执行一个中间操作比如filter实际上不会真的做过滤操作,而是创建一个新的
Stream,当这个新的Stream被遍历的时候,它里头会包含有原来Stream里符合过滤条件的元素。
终点操作比如说forEach或者sum会遍历Stream从而产生最终结果或附带结果。终点操作执行完之后,Stream管道就被消费完了,不再
可用。在几乎所有的情况下,终点操作都是即时完成对数据的遍历操作。
日期时间
Clock
LocalDate 只保存有ISO-8601日期系统的日期部分,有时区信息
LocalTime 只保存ISO-8601日期系统的时间部分,没有时区信息
LocalDateTime类合并了LocalDate和LocalTime,它保存有ISO-8601日期系统的日期和时间,但是没有时区信息
ZonedDateTime,它保存有ISO-8601日期系统的日期和时间,而且有时区信息
Duration类,Duration持有的时间精确到纳秒。它让我们很容易计算两个日期中间的差异
Nashorn javascript引擎
Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用
Base64
新的Base64API也支持URL和MINE的编码解码
并行数组
Java 8新增加了很多方法支持并行的数组处理parallelSort()
并发
java.util.concurrent.ConcurrentHashMap中加入了一些新方法来支持聚集操作
java.util.concurrent.ForkJoinPool类中加入了一些新方法来支持共有资源池
java.util.concurrent.locks.StampedLock类提供一直基于容量的锁,这种锁有三个模型来控制读写操作(它被认为是不太有名的
java.util.concurrent.locks.ReadWriteLock类的替代者)
JDK8新特性面试的更多相关文章
- 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)
		
面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...
 - java进阶一之jdk8新特性
		
1.官方发布的jdk8新特性 2.51CTO相关专题
 - JDK8新特性一览
		
转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...
 - jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;
		
jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional 在使用springboot 方法报错: Inferred type 'S' for type para ...
 - 深入理解java虚拟机---jdk8新特性(二)
		
1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化
 - JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
		
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...
 - JDK8 新特性
		
JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...
 - jdk8新特性
		
JDK8新特性(JDK8的新特性) * 接口中可以定义有方法体的方法,如果是非静态,必须用default修饰 * 如果是静态的就不用了 class Test { public void run() { ...
 - JDK8新特性之一Lambda
		
JDK8的新特性之一Lambda能将函数作为方法里面的参数使用. /** * JDK8新特性Lambda */ public class Test { public static void main( ...
 
随机推荐
- linux的mount(挂载)NFS 共享,命令详解
			
Linux下挂载(mount)光盘镜像文件.移动硬盘.U盘.Windows和NFS网络共享 linux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着 linux系统 ...
 - Java Web 错误排查
			
排查404 1. 检查web.xml,有没有放在web-inf下面,再检查过滤器有没有配置 <filter> <filter-name>struts</filter-na ...
 - storm的并发
			
1 storm并行的基本概念 storm集群中的一个机器可以运行一个或者多个worker,对应于一个或者多个topologies. 1个worker进程运行1个或多个excutor线程.每个worke ...
 - Android Studio的使用(十)--读取assets、Raw文件夹下文件,以及menu、drawable文件夹
			
1.直接在/src/main目录下面新建assets目录 2.接下来即可读取文件 3.读取Raw文件夹下文件也类似.首先在res文件夹下新建raw目录,然后放入需要的文件即可读取. 4.menu和dr ...
 - 对比C#中==与equal方法
			
C#中equal与==的区别 收藏 对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == ...
 - emacs command
			
eval-buffer用来执行.emacs不要再重启了,或cxce执行光标前的一行 eval-region load-file ~/.emacs goto-line global-set-key定义快 ...
 - iOS原生refresh(UIRefreshControl)
			
转载:http://www.2cto.com/kf/201504/392431.html // // ViewController.m // 代码自定义cell // // Created by ma ...
 - wireshark 使用技巧
			
Wireshark使用技巧-GeoIP显示IP地理位置 在使用Wireshark时,有的时候需要知道抓取的报文中某个IP地址的具体地理位置,笨一点的方法是将IP地址复制,然后通过一些软件或 ...
 - 页面新宠图片格式WebP
			
WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间.Facebook Ebay等知名网站已经开始测 ...
 - Android利用canvas画各种图形 及Paint用法 .
			
引自:http://blog.csdn.net/carlfan/article/details/8139984 1.首先说一下canvas类: Class Overview The Canvas cl ...