java 1.8 新特新_java1.8新特性(一)

用户 对象 User:

packagecom.java;public classUser {

String name;intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

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

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

}

@OverridepublicString toString() {return "User [name=" + name + ", age=" + age + "]";

}

}

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

packagecom.java;importjava.util.ArrayList;importjava.util.List;public classTest {public static List users = new ArrayList<>();static{

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

users.add(user);

User user1= new User("李四", 26);

users.add(user1);

}public List findAgeGreater15(List users, intage) {

List tempUser = new ArrayList<>();for(User user : users) {if (user != null) {if (user.getAge() >age) {

tempUser.add(user);

}

}

}returntempUser;

}public static voidmain(String[] args) {

Test test= newTest();

List findAgeGreater15 = test.findAgeGreater15(users, 15);for(User user : findAgeGreater15) {

System.out.println(user);

}

}

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

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

be512661020fa7aed028a0bd88ee6738.png

packagecom.java;

@FunctionalInterfacepublic interfaceUserInterface {boolean filter(intage);

}

public List findAgeGreater15(Listusers, UserInterface userInterface) {

List tempUser = new ArrayList<>();for(User user : users) {if (user != null) {if(userInterface.filter(user.getAge())) {

tempUser.add(user);

}

}

}returntempUser;

}public static voidmain(String[] args) {

Test test= newTest();

List 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 一个 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 表达式规则:(参数) ->(分割参数和表达式)   表达式

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

没有则可以写成:List findAgeGreater15 = test.findAgeGreater15(users, () -> System.out.println("执行完成"));

一个参数可以写成  List findAgeGreater15 = test.findAgeGreater15(users, (int a) -> System.out.println("执行完成"));或者List findAgeGreater15 = test.findAgeGreater15(users, ( a) -> System.out.println("执行完成"));

当只有一个参数的时候 可以不说明类型,该类型是可导类型

多个类型的时候  List findAgeGreater15 = test.findAgeGreater15(users, (int a,int b) -> System.out.println("执行完成"))

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

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

test.findAgeGreater15(users, (int a) ->{

return a > 15;

});

没有返回值的时候:

test.findAgeGreater15(users, (int a) ->

System.out.println("没有返回值")

);

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

public static voidmain(String[] args) {new Thread(newRunnable() {

@Overridepublic voidrun() {

System.out.println("一般写法");

}

}).start();new Thread(() -> System.out.println("Lambda写法")).start();

;

}

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

public static voidmain(String[] args) {

List 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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值