文档章节

java8-lambda实战

RyanMiao
 RyanMiao
发布于 2016/11/20 19:59
字数 870
阅读 56
收藏 1

前言

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
132
0
JAVA 8 新特性 (值得学习)

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

豆芽菜橙
2017/08/20
0
0
java8新特性(二)_lambda表达式

最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看《写给大忙人看的JavaSE8》.这里...

阳光温暖
08/04
0
0
Java8实战 — Lambda表达式详解

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

杰克鹏仔
2016/12/27
16
0
《Java8 实战》-第三章读书笔记(Lambda 表达式-01)

Lambda 表达式 在《 Java8 实战》中第三章主要讲的是,在上一章节的笔记中我们利用了行为参数化来因对不断变化的需求,最后我们也使用到了 Lambda,通过表达式为我们简化了很多代码从而极大地...

火力全開
08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部