Java 8的重要特点
Java 8于2014年3月18日发布。这是软件开发平台的一个革命性的版本,对Java编程、JVM、工具和库进行了各种改进。以下是一些重要和有用的Java 8功能。
功能性接口。
功能性接口是Java 8中引入的一个新概念。只有一个抽象方法的接口成为功能接口,然而,它可以有任何数量的默认或静态方法,它也可以声明一个对象类的方法(例如:toString())。
我们不需要使用@functionalInterface注解来标记一个接口为功能接口,但这个注解是一种便利,可以避免在功能接口中意外添加抽象方法。java.lang.Runnable的单个抽象方法run()是功能接口的一个很好的例子。Lambda表达式可以用来表示一个功能接口的实例
1.兰姆达表达式。
Lambda表达式提供了一种精确的方式,通过使用表达式来实现单一抽象方法(功能接口)。由于功能接口只有一个方法,Lambda表达式可以很容易地提供方法的实现,我们只需要提供方法参数和业务逻辑。它在集合库中也非常有用,它可以帮助迭代、过滤 和提取数据。
举例来说,下面的代码用于实现可运行接口
Runnable r = new Runnable(){@Override public void run() { System.out.println(“My Runnable”); }};
与 兰姆达表达式,上述代码可以缩短到只有一行。
Runnable r1 = () -> { System.out.println(“My Runnable”); };
Lambda表达式被视为一个函数,所以编译器不会单独创建一个.class文件。
2.方法引用
方法引用 可以帮助我们通过它们的名字来指向方法。它使用**::** 符号描述,可以用于静态或实例方法,也可以用于使用new操作符的构造器,如TreeSet::new。方法引用是调用一个方法的λ表达式的速记符号。
str -> System.out.println(str)
你可以用 System.out::println 这样的方法引用代替上面的lambda表达式。
例子 :
public class Abc {public static void thrd(){System.out.println(“Thread is running !”);}public static void main(String[] args) {Thread t2=new Thread(Abc::thrd);t2.start(); }}
3.forEach。
Java 8提供了一个新方法forEach()来遍历集合和流。它被定义在Iterable和Stream接口中。
每当我们需要遍历一个集合时,我们需要创建一个迭代器 ,在这个过程中,如果迭代器使用不当,我们可能会得到ConcurrentModificationException 。
扩展了Iterable接口的集合类可以使用forEach()方法来遍历元素。这个方法只需要一个参数,这个参数是一个功能接口。所以,我们可以传递一个lambda表达式作为参数。
比如说。
public static void main(String[] args) { List<String> list= new ArrayList<String>(); list.add(“Apple”); list.add(“Orange”); list.add(“Banana”);//lambda expression in forEach Method list.forEach(str->System.out.println(str));//above line can also be written using method reference as list.forEach(System.out::println));}
4.流API
Stream是Java 8中引入的一个抽象层。通过流,我们可以像Sql语句一样,以声明的方式处理数据。它表示来自一个支持聚合函数的源的对象序列。流API 将允许顺序和平行执行。
采集接口已被扩展为 stream()和 parallelStream()默认方法来获取流的顺序和并行执行。我们可以使用流来过滤、收集、打印、以及从一个数据结构转换到另一个数据结构等。
流在本质上是功能性的。在一个流上进行的操作不会修改它的源。例如,过滤一个从集合中获得的流,会产生一个新的没有过滤元素的流,而不是从源集合中删除元素。
流操作在内部对源元素进行迭代,与需要显式迭代的集合不同。
流过滤器的例子:
你可以查看更多的例子和Java 8 Stream API支持的所有方法。
5.接口**中的默认和静态方法
**Java 8允许接口有默认和静态方法。在接口中使用默认方法的原因是允许开发人员在不影响实现这些接口的类的情况下为接口添加新的方法,从而使其向后兼容。
向后兼容就是在不破坏旧代码的情况下增加新的功能。
静态方法在接口中与默认方法类似,只是我们不能在实现这些接口的类中覆盖这些方法。
interface ParentInt{ default void defaultMet(){ System.out.println("default method"); } static void staticMet(){ System.out.println("static method"); } void existingMet(String str); } public class child implements ParentInt{ public void existingMet(String str){ System.out.println("String is: "+str); } public static void main(String[] args) { Example obj = new Example(); //calling the default method of interface obj.defaultMet(); //calling the static method of interface ParentInt.staticMet(); //calling the abstract method of interface obj.existingMet("Java 8 Features "); } }
输出:
default methodstatic methodString is: Java 8 Features
6.Base64 编码和解码 。
Java 8中引入的另一个特性是Base64编码和解码。它提供了一个Base64类来处理加密和解密问题。我们需要在源文件中导入java.util.Base64类来使用其方法。
在Java 8之前,我们需要添加外部罐子,如Apache Commons Codec的Base64.encodeBase64(byte[])和Base64.decodeBase64(byte[]),如图所示,或者Sun的内部base64编码器和解码器,sun.misc.BASE64Encoder().encode()和sun.misc.BASE64Decoder().Decode()
以上就是关于Java 8中引入的一些重要特性。希望你能发现它的作用。
谢谢!!:)
Java 8的重要特性最初发表在Medium上的Javarevisited上,在那里人们通过强调和回应这个故事来继续对话。