用户 对象 User:

  1. package com.java;
  2.  
  3. public class User {
  4. String name;
  5. int age;
  6.  
  7. public String getName() {
  8. return name;
  9. }
  10.  
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14.  
  15. public int getAge() {
  16. return age;
  17. }
  18.  
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22.  
  23. public User(String name, int age) {
  24. super();
  25. this.name = name;
  26. this.age = age;
  27. }
  28.  
  29. @Override
  30. public String toString() {
  31. return "User [name=" + name + ", age=" + age + "]";
  32. }
  33.  
  34. }

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

  1. package com.java;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Test {
  7.  
  8. public static List<User> users = new ArrayList<>();
  9. static {
  10.  
  11. User user = new User("张三", 15);
  12.  
  13. users.add(user);
  14. User user1 = new User("李四", 26);
  15. users.add(user1);
  16.  
  17. }
  18.  
  19. public List<User> findAgeGreater15(List<User> users, int age) {
  20. List<User> tempUser = new ArrayList<>();
  21. for (User user : users) {
  22. if (user != null) {
  23. if (user.getAge() > age) {
  24. tempUser.add(user);
  25. }
  26. }
  27. }
  28. return tempUser;
  29. }
  30.  
  31. public static void main(String[] args) {
  32. Test test = new Test();
  33. List<User> findAgeGreater15 = test.findAgeGreater15(users, 15);
  34. for (User user : findAgeGreater15) {
  35. System.out.println(user);
  36. }
  37. }

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

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

  

  1. package com.java;
  2.  
  3. @FunctionalInterface
  4. public interface UserInterface {
  5. boolean filter(int age);
  6.  
  7. }
  1. public List<User> findAgeGreater15(List<User> users, UserInterface userInterface) {
  2. List<User> tempUser = new ArrayList<>();
  3. for (User user : users) {
  4. if (user != null) {
  5. if (userInterface.filter(user.getAge())) {
  6. tempUser.add(user);
  7. }
  8. }
  9. }
  10. return tempUser;
  11. }
  12.  
  13. public static void main(String[] args) {
  14. Test test = new Test();
  15. List<User> findAgeGreater15 = test.findAgeGreater15(users, (int a) -> {
  16. return a > 15;
  17. });
  18. for (User user : findAgeGreater15) {
  19. System.out.println(user);
  20. }
  21. }

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

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

.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. 有返回值的写法:必须要有大括号 和分号

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

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

  1. public static void main(String[] args) {
  2. new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. System.out.println("一般写法");
  6. }
  7. }).start();
  8. new Thread(() -> System.out.println("Lambda写法")).start();
  9. ;
  10. }

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

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

}

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

  1. java1.8新特性之stream流式算法

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...

  2. Stream:java1.8新特性

    原 Stream:java1.8新特性 2017年08月01日 18:15:43 kekeair-zhang 阅读数:392 标签: streamjava1-8新特性 更多 个人分类: 日记 版权声明 ...

  3. java1.7新特性:try-with-resources

    转载:https://blog.csdn.net/fanxiaobin577328725/article/details/53067163 首先看代码: import org.junit.Test; ...

  4. Java1.7新特性

    1.switch语句支持字符串变量 public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) { String typeOf ...

  5. Java1.8新特性——接口改动和Lambda表达式

    Java1.8新特性——接口改动和Lambda表达式 摘要:本文主要学习了Java1.8的新特性中有关接口和Lambda表达式的部分. 部分内容来自以下博客: https://www.cnblogs. ...

  6. java1.8新特性整理(全)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yitian_66/article/deta ...

  7. Java1.8新特性 - Stream流式算法

    一. 流式处理简介   在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...

  8. java1.8新特性

    转自:http://www.oschina.NET/translate/everything-about-Java-8 建议去看原文,此处转载只是为了记录. 这篇文章是对Java8中即将到来的改进做一 ...

  9. java1.8新特性(三 关于 ::的用法)

    java1.8 推出了一种::的语法 用法 身边 基本没人用1.8的新API 目前 我也是只处于学习 运用 阶段 有点 知其然不知其所以然 通过后面的学习,及时查漏补缺 一个类中 有 静态方法 ,非静 ...

随机推荐

  1. Socket远程桌面

    自建Socket转发,使用远程桌面(mstsc)连接家中电脑   网络结构图如下: 开题先放图,一切全靠编哈哈. 进入正题! 如图所示,我们需要一个公网服务器,利用公网服务器将内网的数据进行转发,从而 ...

  2. Web四则混合运算

    一.代码1: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...

  3. 滚动加载图片(懒加载)实现原理(这是旧实现,仅做为获取元素宽高api的参考)

    https://www.cnblogs.com/flyromance/p/5042187.html 本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载 ...

  4. 鸟哥的linux私房菜第4版--自学笔记

    -----------------------------------第一章 intel芯片架构 PS:升级电脑还得看看主板是不是适合CPU,主板适合CPU的类型是有限的PS: 现在已经没有北桥了,已 ...

  5. JQuery中serialize()方法的使用

  6. MySQL Profiling--常用命令

    ##=====================================## ## 查看PROFILING是否开启 SELECT @@profiling ## 开始会话级别PROFILING # ...

  7. sqler sql 转rest api 防止sql 注入

    sqler 对于sql Sanitization 的处理,我们可以使用bind 指令 说明: 这个是2.0 的功能,注意版本的使用 参考格式   addpost {    // $input is a ...

  8. nginx ssi + ngx_pagespeed 实现micro frontends 开发

    nginx 的ssi 功能让我们可以将不同的拼接起来,ngx_pagespeed 是pagespeed 的nginx 模块,可以帮助 我们解决前端的一些性能优化的问题,通过简单的配置就可以搞定 一张参 ...

  9. FastAdmin 生产环境升级注意

    FastAdmin 生产环境升级注意 列出 FastAdmin 实际生产中升级注意事项. 安全相关,看 FastAdmin 的资讯. 如果使用 Git 更新生产文件,注意更新后的权限. JS 修改后注 ...

  10. 持续集成--Jenkins--2

    安装sonar Scanner 打开http://www.sonarqube.org/官网 找到下面扫描器 通过这个扫描器可以分析代码分析 因此你也的安装这个扫描器 上传sonar-scanner-2 ...