简单了解JAVA8的新特性

JAVA8新特性会颠覆整个JAVA程序员的编程习惯

甚至如果您坚守JAVA7之前的编程习惯,今后你看比较年轻的程序员写的JAVA代码都会无法理解

所以为了保证不脱钩,我觉得有必要学习JAVA8的新特性,况且,这会极大得提高CPU效率和编码效率

我们来简单了解一下JAVA8的新特性

我觉得主要有两个比较重要的,一是Lambda表达式,二是集合类的stream操作

关于这两点,我写了几个小DEMO,附上注释,应该能够迅速掌握

如果大家好奇更多的JAVA8新特性,请自行阅读更加专业的知识,敏捷开发不求甚解是我的编程态度。

顺便说一句,JAVA8目前只有最新版eclipse MARs支持编译

即使您下载了JAVA8的JDK和JRE,myeclipse目前还不支持对JAVA8的编译

也就是说下面的代码会在myeclipse下面报错的。

package com.newflypig.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TestJava {
    public static void main(String[] args) {
        // java8 的新特性,lambda表达式,类似于匿名内部类
        Thread testThread = new Thread(() -> {
            List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("aa");
            list.add("bb");
            list.add("cc");
            list.forEach(s -> {
                System.out.println(s);
                ;
            });

            list.stream().filter(s -> s.length() == 2).forEach(s -> {
                System.out.println(s);
            });
        });

        System.out.println("======================================");

        distinct("2", "3", "4", "5", "6", "7", "8", "9", "2", "3", "4", "5", "6", "7", "8", "9");

        testThread.run();
    }

    // 新特性,不定参数
    private static void distinct(String... numbers) {
        List<String> list = Arrays.asList(numbers);
        List<Integer> listInt = list.stream()
            .map(s -> Integer.parseInt(s))         // 将集合流中的元素一一映射为一个新的元素,并生成到新的输出流中
            .filter(a -> isPrime(a))             // 过滤,lambda表达式
            .distinct()                         // stream的高级方法,去除重复
            .collect(Collectors.toList());        // 将整理好的输出流收集到新的listInt集合中
        /**
         * 你可能会觉得在这个例子里,List list被迭代了好多次,
         * map,filter,distinct都分别是一次循环,效率会不好。
         * 实际并非如此。这些返回另一个Stream的方法都是“lazy”的,而最后返回最终结果的collect方法则是“eager”的。
         * 在遇到eager方法之前,lazy的方法不会执行。
         *
         * 当遇到eager方法时,前面的lazy方法才会被依次执行。
         * 而且是管道贯通式执行。这意味着每一个元素依次通过这些管道。
         * 例如有个元素“3”,首先它被map成整数型3;
         * 然后通过filter,发现是素数,被保留下来;又通过distinct,
         * 如果已经有一个3了,那么就直接丢弃,如果还没有则保留。这样,3个操作其实只经过了一次循环。
         *
         * 除collect外其它的eager操作还有forEach,toArray,reduce等
         */

        listInt
            .stream()
            .forEach(i -> {                         // stream的forEach,类似于Collections.forEach
                System.out.println(i);
            });

        int sum=listInt
            .stream()
            .reduce((isum,item)->isum+item)
            .get();
        int min=listInt
            .stream()
            .reduce((a,b)->a<b?a:b)
            .get();
        int max=listInt
            .stream()
            .reduce((a,b)->a>b?a:b)
            .get();
        /**
         * reduce方法接受一个函数,这个函数有两个参数,
         * 第一个参数是上次函数执行的返回值(也称为中间结果),
         * 第二个参数是stream中的元素,这个函数把这两个值相加,
         * 得到的和会被赋值给下次执行这个函数的第一个参数。
         * 要注意的是:第一次执行的时候第一个参数的值是Stream的第一个元素, 第二个参数是Stream的第二个元素。
         * 这个方法返回值类型是Optional,这是Java8防止出现NPE(NULL POINT ELEMENT)的一种可行方法,
         * 这里就简单的认为是一个容器,其中可能会包含0个或者1个对象。
         */
        System.out.println(sum+"\t"+min+"\t"+max);
    }

    private static boolean isPrime(int a) {
        boolean flag = true;
        for (int i = 2; i <= a / 2; i++) {
            if (a % i == 0) {
                flag = false;
                break;
            }
        }
        return flag;
    }
}

对于JAVA8的新特性的学习,可以浅尝辄止,因为大部分现有的框架,目前而且以后相当长时间不会迁移到JAVA8上。

不过新特性Lambda表达式的引入,我感觉会爆发出另一批更为优秀的框架出来

从形式上看,λ表达式只是为你节省了几行代码。

但将λ表达式引入Java的动机并不仅仅为此。

Java8有一个短期目标和一个长期目标。

短期目标是:配合“集合类批处理操作”的内部迭代(脱离于客户代码)和并行处理(更高效地利用现代CPU);

长期目标是将Java向函数式编程语言这个方向引导

并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性,

也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略。

时间: 2024-10-18 04:36:18

简单了解JAVA8的新特性的相关文章

java8的新特性以及用法简介

1. 介绍 2 接口的默认方法 2 lambda表达式 2.1 函数式接口 2.2 方法与构造函数引用 2.3 访问局部变量 2.4 访问对象字段与静态变量 3. 内建函数式接口 3.1 Predicate接口 3.2 Function 接口 3.3 Supplier 接口 3.4 Consumer 接口 3.5 Comparator 接口 3.6 Optional 接口 3.7 Stream 接口 3.7.1 Filter过滤 3.7.2 Sort 排序 3.7.3 Map 映射 3.7.4

java8的新特性1

1.lambda表达式 2.函数式接口 3.StreamAPI 4.方法的引用与构造器的引用 5.接口中的默认方法与静态方法 6.新时间日期API 7.其他新特性 简介 java8的新特性 1.速度更快(内存结构.垃圾回收.并行拓展) 2.代码更少(新增新的语法lambda表达式) 3.强大的streamApI 4.便于并行 5.最大化减少空指针异常,optional lambda表达式 首先:lambda表达式是一个匿名函数,我们可以把lambda表达式理解为一段可以传递的代码(将代码像数据一

Java8部分新特性的学习

Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它没有明确的名字 函数:Lambda函数不属于某个特定的类,但和方法一样都具有参数列表.函数主体.返回类型,还可以有抛出的异常列表 传递:Lambda表达式可以作为参数传递给方法或者存储在变量中. Lambda表达式的基本形式: (parameters)-> expression 或(paramete

java5、java6、java7、java8的新特性

Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数和返回值,Generic是vararg.annotation.enumeration.collection的基石. A.类型安全 抛弃List.Map,使用List<T>.Map<K,V>给它们添加元素或者使用Iterator<T>遍历时,编译期就可以给你检查出类型错误 B

Java8的新特性

Java 8主要新特性包括如下几点: 一.接口的默认方法和静态方法 Java 8版之前,接口只有抽象方法,而在Java 8,为接口新增了两种类型的方法. 第一种是默认方法:在Java 8中,可以通过使用default关键字来添加默认的方法实现. 接口的实现类可以直接使用这些默认的方法,同时还可以重写默认的方法,这不是强制性的重写. package demo.ch; public interface Java8InterfaceDemo { abstract void add(); default

Java8的新特性,二进制序列转十进制数字

package kata_007_二进制序列转十进制int; /** * java8 Lambda表达式转换binary序列->十进制数 */ import java.util.ArrayList; public class ShortBinaryToDecimal { public static void main(String[] args) { ArrayList<Integer> binary = new ArrayList(); binary.add(1); binary.ad

java8 常用新特性

1.Lambda 表达式 (把代码当作参数) //定义了操作接口public interface GreetingService {void sayMessage(String message);}//声明接口的具体操作GreetingService greetService1 = message -> System.out.println("Hello " + message);//调用接口,使用功能greetService1.sayMessage("java&quo

JAVA8 十大新特性详解

本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API “Java is still not dead—and people are starting to figure that out.” 本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字. 一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方

Android 使用Java8新特性之Lambda expression

前言 Lambda expression,java8的新特性.使用Lambda expression,可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂. java8还有其它一些新特性,不过在android上可能都无法使用. studio 2.x后 支持jack编译器,使用它,能使用java8的Lambda expression,但其它特性也不敢保证就能用. 注:Android SDK中集成了JDK的一些源码,有些原生JDK中的类,可能增加了新特性的一些实现,但Android中