文档章节

java8-lambda实战

RyanMiao
 RyanMiao
发布于 2016/11/20 19:59
字数 870
阅读 36
收藏 1
点赞 0
评论 0

前言

java8推出已经很久了,然而其新特性却几乎没有怎么用过。原因是既然已有的只是满足需求何必去学习新的?然而,随着敲代码越来越多,业务上有很多臃肿繁琐的判断校验之类的代码,使得代码很长而且可读性很差。于是,重新捡起了java8。

[TOC]

实际用法

这里是实际代码中使用过的简单套式做法,随时更新。

list过滤

将满足需求的list元素筛选出来。 filter 返回一个boolean值,true的时候通过并放入一个stream里。

接收一个参数list,需要根据元素的某些条件来判断是否满足需求,将满足需求或者不满足需求的元素拿出来。这个正常代码也简单,遍历list,if判断,add赋值到结果集。然而,这个串代码仅仅是一个方法的前置校验部分,这会使得这个方法臃肿难以阅读。虽然重构提取函数可以提高可读性,但分散的代码管理也是麻烦。所以,java8的流式函数编程就适合:

 List<TipUI> badList = tips.stream().filter(tipUI -> StringUtils.isBlank(tipUI.getGaiaId())).collect(Collectors.toList());

list重组

操作list元素中的部分属性构建新的list map用来转换元素

有个users列表,我想要或者这些user的id列表。

@Test
public void testMap(){
    List<User> users = Arrays.asList(
            new User(1,"Ryan"),
            new User(2, "Leslie"),
            new User(3, "Test")
    );
    //collect user ids
    Stream<Integer> integerStream = users.stream().map(User::getId);
    List<Integer> ids = integerStream.collect(Collectors.toList());
    Assert.assertEquals("[1, 2, 3]",ids.toString());

    //collect user names
    List<String> names = users.stream().map(user -> user.getName()).collect(Collectors.toList());
    Assert.assertEquals("[Ryan, Leslie, Test]", names.toString());
}

list过滤并重组

仍旧使用filtermap。这次演示构建过程。

将person列表转换为student列表:

Stream<Student> students = persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(new Function<Person, Student>() {
                  @Override
                  public Student apply(Person person) {
                     return new Student(person);
                  }
              });

简化map的function为lambda:

Stream<Student> map = persons.stream()
        .filter(p -> p.getAge() > 18)
        .map(person -> new Student(person));

因为map的用法中参数的使用只通过传递,那么(前提是student有参数为person的构造器):

Stream<Student> map = persons.stream()
        .filter(p -> p.getAge() > 18)
        .map(Student::new);

收集为list:

List<Student> students = persons.stream()
        .parallel()
        .filter(p -> p.getAge() > 18)  // filtering will be performed concurrently
        .sequential()
        .map(Student::new)
        .collect(Collectors.toCollection(ArrayList::new));

list排序

对list进行排序

比如从大到小排序:

@Test
public void testListSortDesc(){
    Integer a = 12,b = 23;
    Assert.assertEquals(-1, a.compareTo(b));

    List<Integer> list = Arrays.asList(null,a,b,null);
    //large > small
    List<Integer> sorted = list.stream()
            .sorted(( m, n) ->{
                if (m==null) return 1;
                if (n==null) return -1;
                return n.compareTo(m);
            })
            .collect(Collectors.toList());
    Assert.assertEquals("[23, 12, null, null]", sorted.toString());
}

Map排序

map按照value排序,逆序:

@Test
public void testHashMapSortByValueDesc(){
    Map<String, Integer> unsortMap = new HashMap<>();
    unsortMap.put("z", 10);
    unsortMap.put("b", 5);
    unsortMap.put("a", 6);
    unsortMap.put("c", 20);
    unsortMap.put("d", 1);
    unsortMap.put("e", 7);
    unsortMap.put("y", 8);
    unsortMap.put("n", 99);
    unsortMap.put("j", 50);
    unsortMap.put("m", 2);
    unsortMap.put("f", 9);

    LinkedHashMap<String, Integer> orderMap = unsortMap.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    (e1, e2) -> e1,
                    LinkedHashMap::new
            ));
    Assert.assertEquals("{n=99, j=50, c=20, z=10, f=9, y=8, e=7, a=6, b=5, m=2, d=1}",
            orderMap.toString());
}

自定义map类型:

//re-init brandScoreMap
LinkedHashMap<String, Score> scoreMap = brandScoreMap.entrySet().stream()
                .collect(Collectors.toMap(p -> p.getKey(), p -> new Score(p.getValue(), caculateGrade(p.getValue())), (e1, e2) -> e1, LinkedHashMap::new));
       

基础知识

此处留着等待系统学习的时候补上。

© 著作权归作者所有

共有 人打赏支持
RyanMiao
粉丝 10
博文 13
码字总数 16643
作品 0
深圳
程序员
Java8中的简易并发

我们在《实战Java高并发程序设计》一书中,专门介绍过java 8中对并发的改进。这里我通过转载一篇博客来说简单介绍下。 有人曾经说过(很抱歉,我们找不到原句了): 初级程序员认为并发很难。...

吴小编 ⋅ 2016/04/12 ⋅ 0

JAVA 8 新特性 (值得学习)

JAVA 8 已经出现好长时间了,大的互联网公司很多都已经使用了,甚至很多知名互联网公司踩过很多坑,也有一些大牛分享出了他们的实战经验。去很多知名的互联网公司经常会被面试官问,你了解j...

豆芽菜橙 ⋅ 2017/08/20 ⋅ 0

Java8实战 — Lambda表达式详解

Lambda管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数、函数主体和返回类型,可能还有一个可以抛出的异常列表。 何为更简介,做一个例子,...

杰克鹏仔 ⋅ 2016/12/27 ⋅ 0

《Java8实战》读书笔记

Java8(https://book.douban.com/subject/26772632/) 引入更多编程概念、编程工具,简洁、灵活地编写代码。 优化步骤: 1)进一步复用代码,抽取公共的逻辑代码,参数化可变的逻辑代码 2)声明...

v1-alpha ⋅ 2016/12/16 ⋅ 0

Java 8来了!!! 极客学院推出中国第1个Java8课程,详解Lambda 表达式

3月发布的Java 8有哪十大新特性,你知道不? 不知道?没关系,因为没几个家伙知道。不过看到这条消息的你将非常幸运:极客学院推出中国第1个Java 8课程,详细讲解最核心的Lambda 表达式使用方...

jikexueyuan ⋅ 2014/04/09 ⋅ 0

spark2.x由浅入深深到底系列六之RDD 支持java8 lambda表达式

学习spark任何技术之前,请正确理解spark,可以参考:正确理解spark 我们在 http://7639240.blog.51cto.com/7629240/1966131 中已经知道了,一个scala函数其实就是java中的一个接口,对于jav...

tangweiqun ⋅ 2017/09/20 ⋅ 0

30分钟入门Java8之方法引用

30分钟入门Java8之方法引用 作者:@JohnTsai 本文为作者原创,转载请注明出处:https://www.cnblogs.com/JohnTsai/p/5806194.html 30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了J...

spinachgit ⋅ 01/12 ⋅ 0

Java8 Lambda表达式

函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论。FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那...

mifans ⋅ 2016/11/02 ⋅ 0

Java8 学习笔记

先来一个概览,上图是我整理的Java8中的新特性,总的来看,大致上可以分成这么几个大块。 函数式接口 所谓的函数式接口就是只有一个抽象方法的接口,注意这里说的是抽象方法,因为Java8中加入...

xrzs ⋅ 2013/05/14 ⋅ 0

Java8-初识Lambda

廉颇老矣,尚能饭否 Java,这位已经20多岁的编程语言,称得上是编程语言界的老大哥了。他曾经攻城略地,碾压各路编程语言小弟,风光无限,不可一世。现在,也是家大业大,江湖地位,很难撼动...

Jackie_Zheng ⋅ 2017/09/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL主从复制原理、半同步操作步骤及原理

1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。 2、搭建ftp/http/svn/nfs 服务器,然后在客户端上也可以把数据同步到服务器。...

xiaomin0322 ⋅ 21分钟前 ⋅ 0

Oracle10g 数据及文件迁移过程[原]

QL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 11 10:22:35 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Re......

harrypotter ⋅ 27分钟前 ⋅ 0

nginx安装

1:安装工具包 wget、vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc gcc-c++ 2:下载nginx安装包 wget http://nginx.org/download/nginx-1......

壹丶贰 ⋅ 30分钟前 ⋅ 0

ideaVim安装及配置

1.安装插件 File-Settings-Plugins,Browse Repositories,输入ideavim,安装。 重启后,在Tools-Vim Emulator启用。 2.快捷键设置 ideaViim键与idea快捷键有冲突,可以在Settings-Other Se...

Funcy1122 ⋅ 34分钟前 ⋅ 0

MySQL中B+Tree索引原理

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B...

浮躁的码农 ⋅ 49分钟前 ⋅ 0

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 53分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 今天 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 今天 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部