JAVA 8 新特性 (值得学习)

简介:

JAVA 8 已经出现好长时间了,大的互联网公司很多都已经使用了,甚至很多知名互联网公司踩过很多坑,也有一些大牛分享出了他们的实战经验。去很多知名的互联网公司经常会被面试官问,你了解java 8吗?你知道它的一些新特性吗?好像似乎成了一面面试官必问的一道题目。这篇博文,只是简答的介绍了一下新特性,同学们还得自己实际操作,深入了解,最好能实际应用到项目里,如果你是项目组里用的比较早,用的比较多的同学,还会被其他的同事注意到你,哈哈。


Lambda表达式和函数式接口

下面就是简单的lambda表示的应用,代码非常简洁,直接item则是list集合里的String,输出就可以了

,item是编译器自动推理得出是一个String类型的

1
2
3
4
5
6
7
8
9
List<String> list = Arrays.asList( "sdc" , "zs" , "ls" , "ww" );
         
list.forEach(item -> {
     System.out.println(item);
});
 
Stream.of( 12 , 21 , 13 , 31 ).filter( s -> {
System.out.println( "out:"  +s);  return  true ;})
.forEach(System.out::println);;


这个就是简单的的lambda表达式,lambda其实和函数式接口联系是比较多的,java8里也有好多的类是函数式接口,什么是函数式接口?函数接口指的就是只有一个函数的接口,是不是很绕口,这又有什么关系?我也说不清楚,函数式接口是可以自定义的,一般再接口最上方加上@FunctionalInterface这个注解,就是函数式接口了,一般函数接口是不准许有其他的函数,但是默认方法和静态方法可以排除,以前java接口里没有看到可以写方法的,java8里可以写默认方法。


下面简单写一个默认方法和抽象方法,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private  interface  DefaultInterface {
         
         default  String defaultMethod() {
             return  "default method" ;
         }
         
}
     
private  interface  DefaultInterfaceStatic {
         
         static  String staticMethod() {
             return  "static method" ;
         }
         
}


有时间的同学看一下 Collection<E> 这个接口里的东西,这个集合接口里有一些用到默认方法的实现,有一些是它本身自带的,有些是继承 Iterable<T> 这个接口而覆盖了这个接口里的默认方法。例如:

1
2
3
  default  Stream<E> stream() {
         return  StreamSupport.stream(spliterator(),  false );
     }


同学们可以自己动手写写函数式接口,和接口里的默认方法,尝试一下,本身自己的项目是否可以修改成这样的。


重复注解:

java 8 也可以定义重复注解,java本身是支持自自定义注解的,比如如下

1
2
3
4
5
6
7
8
@Target ({ ElementType.METHOD, ElementType.TYPE })
@Retention (RetentionPolicy.RUNTIME)
@Documented
public  @interface  Test {
 
         String test()  default  "无" ;
 
}

这就是一个自定义注解。


java8 定义重复注解,

 @Repeatable( Filters.class )

注解上加上这个,则可以定义重复注解,不过一般公司开发或者大型公司开发,自定义注解是比较多,但是重复注解有什么用,我还是没搞懂,所以这块就简单介绍了一下,怎么定义就行,重复注解什么场景使用我就不太清楚了。


Streams

这个特性可能是java 8 里比较高级的一个特性,用java边写的时候,集合往往用的是最多的,写一个接口很大可能会涉及到集合。通常集合的迭代逻辑都是for循环,Streams则是隐藏了这种操作,简化了开发。再java8以前的集合都是加载内存中的,非常占用内用,但是又不得不使用,Streams则是再访问的时候才开始计算出来。

什么是Streams?下面几个简单的例子来解释

1
2
3
4
5
6
7
List<String> list = Arrays.asList( "sdc" , "zs" , "ls" , "ww" );
 
这样就是一套流
list.stream().filter(s -> s.startsWith( "s" )).map(String::toUpperCase).sorted().forEach(System.out::println);
 
也可以这样
Arrays.asList( "sdc" , "zs" , "ls" , "ww" ).stream().findFirst().ifPresent(System.out::println);


streams包含中间和最终两种形式的操作,中间操作返回的还是一个streams,但是不会有输出,最总操作是返回有结果的。上面写的map,sorted,findFirst都是中间操作,如果不加后面的话就会没有输出操作,大多数的streams操作都是可以使用lambda表达式的。


Streams类有顺序的streams和并行的streams,并行一看就是多线程的类,适合在多线程中用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//      Arrays.asList("sdc","zs","ls","ww").stream().findFirst().ifPresent(System.out::println);
         
//      Stream.of("sdc","zs","ls","ww").findFirst().ifPresent(System.out::println);
         
//      IntStream.range(1, 4).forEach(System.out::println);
         
//      Arrays.stream(new int[]{4,5,6}).map(n -> 2*n +1).average().ifPresent(System.out::println);
         
//      IntStream.range(1, 4).mapToObj(p -> "sucess" + p).forEach(System.out::println);
         
//      Stream.of(100.0, 200.0, 300.0).mapToInt(Double::intValue).mapToObj(h -> h+"str").forEach(System.out::println);
         
//      Stream.of(12,21,13,31).filter( s -> {System.out.println("out:" +s); return true;});
         
//      Stream.of(12,21,13,31).filter( s -> {System.out.println("out:" +s); return true;}).forEach(System.out::println);;
         
//      Stream.of("ds","qw","ty","op","as")
//          .map(s -> {
//              System.out.println("map:" + s);
//              return s.toUpperCase();
//          })
//          .filter(s -> {
//              System.out.println("filter:" + s);
//              return s.startsWith("Q");
//          })
//          .forEach(s -> {
//              System.out.println("foreach:" + s);
//          });
         
//      Stream.of("ds","qw","ty","op","as")
//      .filter(s -> {
//          System.out.println("filter:" + s);
//          return s.startsWith("q");
//      })
//      .map(s -> {
//          System.out.println("map:" + s);
//          return s.toUpperCase();
//      })
//      .forEach(s -> {
//          System.out.println("foreach:" + s);
//      });
     
//      Stream.of("ds","qw","ty","op","as")
//      .sorted((s1, s2) -> {
//          System.out.println("sorted:" + s1 +"," +s2);
//          return s1.compareTo(s2);
//      })
//      .filter(s -> {
//          System.out.println("filter:" + s);
//          return s.startsWith("q");
//      })
//      .map(s -> {
//          System.out.println("map:" + s);
//          return s.toUpperCase();
//      })
//      .forEach(s -> {
//          System.out.println("foreach:" + s);
//      });
         
//      Stream.of("ds","qw","ty","op","as")
//      .filter(s -> {
//          System.out.println("filter:" + s);
//          return s.startsWith("q");
//      })
//      .sorted((s1, s2) -> {
//          System.out.println("sorted:" + s1 +"," +s2);
//          return s1.compareTo(s2);
//      })
//      .map(s -> {
//          System.out.println("map:" + s);
//          return s.toUpperCase();
//      })
//      .forEach(s -> {
//          System.out.println("foreach:" + s);
//      });
         
//      Stream<String> stream = Stream.of("a1", "d3", "i9","r8").filter( s-> s.startsWith("i"));
//      stream.anyMatch(s -> true);
//      stream.noneMatch(s -> true);
         
//      Supplier<Stream<String>> streamSupplier = () ->Stream.of("a1", "d3", "i9","r8").filter( s-> s.startsWith("i"));
//      streamSupplier.get().anyMatch(s -> true);
//      streamSupplier.get().noneMatch(s -> true);
         
         //stream 的高级特性
         List<User> userList = Arrays.asList( new  User( "sdc" 20 ),  new  User( "zhangsan" 20 ),  new  User( "lisi" 34 ));
//      List<User> newList = userList.stream().filter(u -> u.getUser().startsWith("s")).collect(Collectors.toList());
//      Set<User> set = userList.stream().filter(u -> u.getUser().startsWith("s")).collect(Collectors.toSet());
//      System.out.println(set);
         
//      Map<Integer, List<User>> userGMap = userList.stream().collect(Collectors.groupingBy(u -> u.getAge()));
//      userGMap.forEach((age, p) -> {
//          System.out.println(age + "||" + p);
//      });
         
//      double averrage = userList.stream().collect(Collectors.averagingInt(u -> u.getAge()));
//      System.out.println(averrage);
         
//      String phrase = userList.stream().filter(u -> u.getAge() >=19).map(p -> p.getUser()).collect(Collectors.joining(" and ", " in ", " high age "));
//      System.out.println(phrase);


这些是基本的一些方法,我觉得还是自己用用,实战一下,可能很多人都不太习惯这些操作。



本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1957734

相关文章
|
20天前
|
缓存 运维 Java
Java静态代码块深度剖析:机制、特性与最佳实践
在Java中,静态代码块(或称静态初始化块)是指类中定义的一个或多个`static { ... }`结构。其主要功能在于初始化类级别的数据,例如静态变量的初始化或执行仅需运行一次的初始化逻辑。
35 4
|
2月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
46 10
|
2月前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
251 4
|
2月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
48 4
|
2月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
62 1
|
5月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
136 43
Java学习十六—掌握注解:让编程更简单
|
3月前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
3月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
129 6
|
4月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
57 4
|
4月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。