java8新特性

最近学Java遇到了一些java8的新特性记录一下我根据比较频繁的

1 Lambda表达式
Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构。最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:

Arrays.asList( “a”, “b”, “d” ).forEach( e -> System.out.println( e ) );

如果Lambda表达式需要更复杂的语句块,则可以使用花括号将该语句块括起来,类似于Java中的函数体,例如:

Arrays.asList( “a”, “b”, “d” ).forEach( e -> {
System.out.print( e );
System.out.print( e ); } );

2 @FunctionalInterface注解
什么是函数式接口(Functional Interface)
其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。
正确例子,没有报错:

@FunctionalInterface interface GreetingService {
void sayMessage(String message); }

错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse报错提示其不是函数式接口。在这里插入图片描述
加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法

函数式接口里允许定义默认方法
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;
如下代码不会报错:

@FunctionalInterface interface GreetingService { void
sayMessage(String message);

default void doSomeMoreWork1() {
// Method body }

default void doSomeMoreWork2() {
// Method body } }

函数式接口里允许定义静态方法
函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;
如下代码不会报错:

@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
static void printHello(){
System.out.println(“Hello”);
}
}

3 方法引用
第一种方法引用的类型是构造器引用,语法是Class::new,或者更一般的形式:Class::new。注意:这个构造器没有参数。

final Car car = Car.create( Car::new ); final List< Car > cars =Arrays.asList( car );

第二种方法引用的类型是静态方法引用,语法是Class::static_method。注意:这个方法接受一个Car类型的参数。

cars.forEach( Car::collide );

第三种方法引用的类型是某个类的成员方法的引用,语法是Class::method,注意,这个方法没有定义入参:

cars.forEach( Car::repair );

第四种方法引用的类型是某个实例对象的成员方法的引用,语法是instance::method。注意:这个方法接受一个Car类型的参数:

final Car police = Car.create( Car::new ); cars.forEach(
police::follow );

4 Streams
Stream(流)是一个来自数据源的元素队列并支持聚合操作
常常用于创建一个保存收集结果的集合,对传进来的集合进行遍历,通过特定的条件筛选,然后将筛选的结果添加到结果集并返回

filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

List strings = Arrays.asList(“abc”, “”, “bc”, “efg”,“abcd”,"", “jkl”);
List filtered =strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());

map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //
获取对应的平方数 List squaresList = numbers.stream().map( i ->
i*i).distinct().collect(Collectors.toList());

Date/Time API(JSR 310)
Clock类使用时区来返回当前的纳秒时间和日期。Clock可以替代System.currentTimeMillis()和TimeZone.getDefault()。

System.out.println( clock.instant() ); System.out.println(
clock.millis() );
返回结果
2014-04-12T15:19:29.282Z
1397315969360

第二,关注下LocalDate和LocalTime类。LocalDate仅仅包含ISO-8601日历系统中的日期部分;LocalTime则仅仅包含该日历系统中的时间部分。这两个类的对象都可以使用Clock对象构建得到。

final LocalDate date = LocalDate.now();
final LocalDate dateFromClock = LocalDate.now( clock );
System.out.println( date );
System.out.println( dateFromClock );

final LocalTime time = LocalTime.now();
final LocalTime timeFromClock= LocalTime.now( clock );
System.out.println( time );
System.out.println( timeFromClock );
返回结果
2014-04-12 2014-04-12
11:25:54.568 15:25:54.568

未完待续。。。 错误请指教

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值