java1.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 表达式规则:(参数) ->(分割参数和表达式) 表达式
关于 参数的写法:参数可以可以没有 (和定义的接口 参数列表有关系)
- 没有则可以写成:List<User> findAgeGreater15 = test.findAgeGreater15(users, () -> System.out.println("执行完成"));
- 一个参数可以写成 List<User> findAgeGreater15 = test.findAgeGreater15(users, (int a) -> System.out.println("执行完成"));或者List<User> findAgeGreater15 = test.findAgeGreater15(users, ( a) -> System.out.println("执行完成"));
当只有一个参数的时候 可以不说明类型,该类型是可导类型 - 多个类型的时候 List<User> 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 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);
}
}
java1.8新特性(一)的更多相关文章
- java1.8新特性之stream流式算法
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...
- Stream:java1.8新特性
原 Stream:java1.8新特性 2017年08月01日 18:15:43 kekeair-zhang 阅读数:392 标签: streamjava1-8新特性 更多 个人分类: 日记 版权声明 ...
- java1.7新特性:try-with-resources
转载:https://blog.csdn.net/fanxiaobin577328725/article/details/53067163 首先看代码: import org.junit.Test; ...
- Java1.7新特性
1.switch语句支持字符串变量 public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) { String typeOf ...
- Java1.8新特性——接口改动和Lambda表达式
Java1.8新特性——接口改动和Lambda表达式 摘要:本文主要学习了Java1.8的新特性中有关接口和Lambda表达式的部分. 部分内容来自以下博客: https://www.cnblogs. ...
- java1.8新特性整理(全)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yitian_66/article/deta ...
- Java1.8新特性 - Stream流式算法
一. 流式处理简介 在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...
- java1.8新特性
转自:http://www.oschina.NET/translate/everything-about-Java-8 建议去看原文,此处转载只是为了记录. 这篇文章是对Java8中即将到来的改进做一 ...
- java1.8新特性(三 关于 ::的用法)
java1.8 推出了一种::的语法 用法 身边 基本没人用1.8的新API 目前 我也是只处于学习 运用 阶段 有点 知其然不知其所以然 通过后面的学习,及时查漏补缺 一个类中 有 静态方法 ,非静 ...
随机推荐
- crash - JNI WARNING: input is not valid modified utf-8: illegal continuation byte
the key point is "Modified UTF-8" is not like "Regular UTF-8", a legal Rgular UT ...
- LeetCode - Top K Frequent Words
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- LG4781 【模板】拉格朗日插值
题意 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$取模 输入输出格 ...
- ios存储图片注意
以下方法可以解决 ios不能长按图片保存到手机的问题 -webkit-touch-callout:default;
- Python中msgpack库的使用
msgpack用起来像json,但是却比json快,并且序列化以后的数据长度更小,言外之意,使用msgpack不仅序列化和反序列化的速度快,数据传输量也比json格式小,msgpack同样支持多种语言 ...
- linux 条件
1.文件状态测试-d 目录 -r 可读-f 常规文件 -w 可写-L 符号连接 -x 可执行-s 文件长度大于0,非空 -u 文件有suid位设置 示例: [ -s haison.c ] 0表示成功, ...
- cocos2d-x游戏开发 跑酷(三) 人物跑动
原创.转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21245881 好吧.最终要跑起来了. 要实现跑酷须要用到帧动画,什么是帧动画,不 ...
- Spring事务管理机制的实现原理-动态代理
之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...
- elastic 部分更新 retry_on_conflict 和 数据库写锁 详细比对
1 数据库的 update 在修改这条数据的的过程中(这个过程指的是 数据库执行update 到 事务提交的过程中 )为这条数据加上 写锁,阻止 别的事务 对锁定数据的修改,请求后一个修改事务的线程 ...
- bootstrap中的模态框(modal,弹出层)
默认的modal示例: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...