java1.8新特性(一)

一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api  引起注意的还是  关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什么语言,花点时间学习新的api还是很有必要的,在工作中 还用一些 1.8的新特性,但是 始终 是 不明白。总是有问题,特意花些时间 去重点学习一下,如果其中 有什么说的不对,请一定要提出来!

用户 对象 User:

package com.java;

public class User {
    String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }

}

需求1:从所有的用户中 找出 age大于15的用户

package com.java;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static List<User> users = new ArrayList<>();
    static {

        User user = new User("张三", 15);

        users.add(user);
        User user1 = new User("李四", 26);
        users.add(user1);

    }

    public List<User> findAgeGreater15(List<User> users, int age) {
        List<User> tempUser = new ArrayList<>();
        for (User user : users) {
            if (user != null) {
                if (user.getAge() > age) {
                    tempUser.add(user);
                }
            }
        }
        return tempUser;
    }

    public static void main(String[] args) {
        Test test = new Test();
        List<User> findAgeGreater15 = test.findAgeGreater15(users, 15);
        for (User user : findAgeGreater15) {
            System.out.println(user);
        }
    }

要实现 上面的需求其实有很多种方法,讲一个基本的方法 和  使用 java1.8 Lambda 方法 实现该需求:

首先:java1.8  提供了 函数式编程(概念可百度)需要 提供一个接口:(不包括 defulet方法 和 static方法)

  

package com.java;

@FunctionalInterface
public interface UserInterface {
    boolean filter(int age);

}
    public List<User> findAgeGreater15(List<User> users, UserInterface userInterface) {
        List<User> tempUser = new ArrayList<>();
        for (User user : users) {
            if (user != null) {
                if (userInterface.filter(user.getAge())) {
                    tempUser.add(user);
                }
            }
        }
        return tempUser;
    }

    public static void main(String[] args) {
        Test test = new Test();
        List<User> findAgeGreater15 = test.findAgeGreater15(users, (int a) -> {
            return a > 15;
        });
        for (User user : findAgeGreater15) {
            System.out.println(user);
        }
    }

关于  test.findAgeGreater15(users, (int a) -> {return a > 15;}); 调用 findAgeGreater15 方法的时候  参数类型(有两个 一个 List<User> 一个 UserInterface ):
  我这是这样理解的, 调用该方法的时候  将 (int a) -> {return a > 15;} 这个函数 当成一个 UserInterface的参数类型 传入该方法中,在 findAgeGreater15  方法体中

 if (userInterface.filter(user.getAge())) {
                    tempUser.add(user);
               }

.filter(user.getAge()) 执行的方法 就是 判断 user.getAge() 是否 大于 15   user.getAge()类似于 变量a 只要 满足 user.getAge() >15 则返回true。

关于Lamabda 表达式规则:(参数) ->(分割参数和表达式)   表达式

关于 参数的写法:参数可以可以没有 (和定义的接口 参数列表有关系)

  1. 没有则可以写成:List<User> findAgeGreater15 = test.findAgeGreater15(users, () -> System.out.println("执行完成"));
  2. 一个参数可以写成  List<User> findAgeGreater15 = test.findAgeGreater15(users, (int a) -> System.out.println("执行完成"));或者List<User> findAgeGreater15 = test.findAgeGreater15(users, ( a) -> System.out.println("执行完成"));
    当只有一个参数的时候 可以不说明类型,该类型是可导类型
  3. 多个类型的时候  List<User> findAgeGreater15 = test.findAgeGreater15(users, (int a,int b) -> System.out.println("执行完成"))

关于表达式的写法:主要就是 有无返回值(和定义的接口 参数返回值有关系):

  1. 有返回值的写法:必须要有大括号 和分号

    test.findAgeGreater15(users, (int a) -> {
                return a > 15;
            });
  2. 没有返回值的时候:
    test.findAgeGreater15(users, (int a) ->
             System.out.println("没有返回值")
           );

个人感觉 在使用Lambda的时候 比较困难的是 不知道 什么时候该用Lambda 或者 怎么用,这个需要实际中靠自己去 衡量,比如上面解决 age>15的这个需求 ,其实 常规操作 比使用Lambda 更快  使用 Lambda 还要去创建 接口 对 语法 不熟悉 还 要慢慢写。所以 虽然新特性。但是解决的时候 还是得看需求,别整复杂了,在写两个可能比较常用的Lambda表达式用处:

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("一般写法");
            }
        }).start();
        new Thread(() -> System.out.println("Lambda写法")).start();
        ;
    }

对一个集合从大到小进行排序:

public static void main(String[] args) {
        List<Integer> list = Arrays.asList(15, -1, 2, 9, 12);
        list.sort((Integer a, Integer b) -> b.compareTo(a));
        for (Integer integer : list) {
            System.out.println(integer);
        }

}

原文地址:https://www.cnblogs.com/920913cheng/p/10209675.html

时间: 2024-10-12 19:39:46

java1.8新特性(一)的相关文章

了解Java1.8新特性

前几天电脑上的JDK自动更新到1.8,这两天了解了一下JDK1.8的一些新特性.下面就来浅谈一下我所了解的. 我们都知道,Java是不能多继承的,但是可以多实现.它与C++不同,C++是可以多继承的.尽管Java可以实现多个接口,但是接口中只能有抽象方法,不能有具体的实现.但是在JDK1.8中,接口里新增了默认方法.可以对默认方法进行具体的实现,但是这个方法必须是default.看下面这段代码: 1 interface AA{ 2 public int add(int a,int b); //申

java1.4升级到java1.5 新特性

前几天和一位腾讯的技术大牛聊天,聊到关于jdk的很多支持,包括jvm的优化,gc的调用机制,1.4-到1.8每次升级版本的新特性等,做软件这行这么多年了,一直在使用java,但是却从来没有细细的研究每个版本新特性到底有什么不同,所以特意编写了这么一篇文档,让自己能了解些他们的新特性,也共享一下新特性的改变,当然我下面的验证并不能当做最官方的,但最起码我是一个一个实验了,如果存在问题或解释的不正确的,也劳烦各位大牛给予指正. 目前我下载的jdk版本,如果大家需要这些版本的话,后期我会上传到百度云上

Java1.8新特性

1.Lambda表达式和函数式接口 Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变.它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念.很多JVM平台上的语言(Groovy.Scala等)从诞生之日就支持Lambda表达式,但是Java开发者没有选择,只能使用匿名内部类代替Lambda表达式. Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构.最简单的Lambda表

java1.8 新特性(五 如何使用filter,limit ,skip ,distinct map flatmap ,collect 操作 java集合)

使用filter 根据 条件筛选 出结果:例如 找出 user 中 age >=15 的用户 package lambda.stream; /** * @author 作者:cb * @version 创建时间:2019年1月4日 下午2:35:05 */ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; publi

java1.8 新特性(关于 match,find reduce )操作

match处理Integer集合 package lambda.stream; /** * @author 作者:cb * @version 创建时间:2019年1月4日 下午2:35:05 */ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamDemo { public st

java1.8新特性(optional 使用)

经常在程序中出现 java.lang.NullPointerException  为了避免  报错,总是要进行一些 是否为null 的if else 判断 ,1.8 可以使用optional 类 来简化处置   optional :A container object which may or may not contain a non-null value.:可能包含也可能不包含非空值的容器对象. 既然optional 是一个容器对象,那就应该先创建该 对象 才能调用该对象的一些方法 创建op

黑马程序员------Java中jdk1.5新特性

Java培训.Android培训.iOS培训..Net培训.期待与您交流! JDK1.5新特性: 为什么会出现新特性: 新的技术出现是为了解决老的问题,Java语言为了提高开发者的开发效率,对之前的某些不利于提高效率的技术进行改进. 静态导入: 静态导入:可以导入某个类下的静态方法,静态导入后,可以不写类名而直接使用此类下的静态方法. 语法:import static 包名.类名.静态方法 代码示例: package com.itheima.day1; /** * 静态导入 * @author

JAVA JDK1.5-1.9新特性

JAVA JDK1.5-1.9新特性 1.5 1.自动装箱与拆箱: 2.枚举(常用来设计单例模式) 3.静态导入 4.可变参数 5.内省 1.6 1.Web服务元数据 2.脚本语言支持 3.JTable的排序和过滤 4.更简单,更强大的JAX-WS 5.轻量级Http Server 6.嵌入式数据库 Derby 1.7 1,switch中可以使用字串了 2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断 3.语法上支持集合,而不一定是数组 4

java1.5的新特性

java1.5的新特性. java作为一门语言,是sun公司出品,这门语言有自己的语法规范.同时围绕着这门语言有一些基本的类库来供大家使用. 一门程序设计语言,可以简单的认为包含两部分,一个是基本的语法规则(包括关键字),另一个是用来支持这门语言的一些系统级得到基础类库. 所以,一门程序设计语言是可以不断被升级更新的,升级更新后的语言可能会增加新的语法规范. java1.5和java1.4作为不同版本的java语言,就有些不一样的地方: 所以就有java1.5的新特性需要掌握: 1.java1.