Java8新特性Lambda表达式的一些复杂用法总结

简介

lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。

它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

本文将介绍关于Java8 Lambda表达式的一些复杂用法,分享出来供大家参考学习,下面来一起看看详细的介绍:

复杂用法实例

传入数组ids,在list<Obj>上操作,找出Obj中id想匹配的,并且按照id进行collect成map(这里假设找出来的按照id不重复)

@Override
public Map<Integer, MyObj> getOperationByShipmentIds(Collection<Integer> ids) {
 return storage
   .stream()
   .filter(op -> ids.contains(op.getId()))
   .collect(Collectors.toMap(MyObj::getId, Function.identity()));
}

接上面的,假设id可以重复:

@Override
public Map<Integer, MyObj> getOperationByShipmentIds(Collection<Integer> ids) {
 return storage
   .stream()
   .filter(op -> ids.contains(op.getId()))
   .collect(Collectors.groupingBy(MyObj::getId));
}

对象列表某一列求和

list.values().stream().mapToInt(obj -> obj.getIntField()).sum();

多个list追加到同一个中

List<MyObject> list = services.stream()
        .flatMap(s -> s.getObjects().stream())
        .collect(Collectors.toList());

类似wordCount计数

import java.util.*;
import java.util.stream.*;

class Test {
 public static void main(String[] args) {
  List<String> list = new ArrayList<>();

  list.add("Hello");
  list.add("Hello");
  list.add("World");

  Map<String, Long> counted = list.stream()
   .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

  System.out.println(counted);
 }
}

使用Lambda实现分段chunk

AtomicInteger counter = new AtomicInteger();

stream.collect(groupingBy(x->counter.getAndIncrement()/chunkSize))
 .values()
 .forEach(database::flushChunk);

跑个题,上面的那个也可以用apache commons搞定

ListUtils.partition(list, batchSize)

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • java8学习教程之lambda表达式的使用方法

    前言 我们在 上一篇文章 中介绍了 lambda 表达式的语法,引入了 lambda 表达式的使用场景,以及使用 lambda 表达式的好处.我们将在这篇文章中,已实例讲解如何定义和使用 lambda 表达式,以及与其它语言相比,lambda 表达式在 Java 中的特殊规范. 使用匿名内部类的例子 首先明确一点,在 Java8 出现之前,lambda 表达式能够做到的,使用内部类也能做到,lambda 表达式只是简化了编程. 下面的例子是从列表中根据条件挑选出读者. 定义 TantanitRe

  • Java8中lambda表达式的应用及一些泛型相关知识

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public class Employee { public String name; public int age; public char sex; public String time; public int salary; } 我们有一列此类数据 List<Employee> data = Arrays.asL

  • Java8 新特性Lambda表达式实例详解

    Java8 新特性Lambda表达式实例详解 在介绍Lambda表达式之前,我们先来看只有单个方法的Interface(通常我们称之为回调接口): public interface OnClickListener { void onClick(View v); } 我们是这样使用它的: button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { v.setText("

  • Java8新特性之Lambda表达式浅析

    说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

  • Java8中的 Lambda表达式教程

     1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成λ表达式后是这个样子: (int x, int y) -> x + y; 参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返回两数之和 或者 (x, y) -> { return x + y; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(-&g

  • Java8深入学习系列(一)lambda表达式介绍

    前言 最近在学习java8,所以接下来会给大家介绍一系列的Java8学习内容,那么让我们先从lambda表达式开始. 众所周知从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能. 很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了 这种编程风格.在此之前我们都在写匿名内部类干这些事,但有时候这不是好的做法,本文中将介绍和使用lambda, 带你体验函数式编程的魔力. 什么是lambda? lambda表达

  • 30分钟入门Java8之lambda表达式学习

    前言 Google在今年发布Android N开发者预览版,一并宣布开始支持Java 8.我们终于能在Android开发中使用到Java8的一些语言特性了.目前支持: 默认方法 lambda表达式 多次注解 今天我们就简要学习lambda表达式. 配置开发环境 首先需要下载安装JDK1.8. 如果想在Android开发中使用lambda表达式,需要在Android Studio中配置Java 8开发环境. 配置app的Gradle文件: 开启jack编译选项 设置编译选项兼容到1.8 andro

  • Java8学习教程之lambda表达式语法介绍

    前言 相信大家都知道,在Java8 中引入了 lambda 表达式,从行为参数化的角度,在使用时,将行为作为参数,去除包围在外层的不必要的类声明,使代码更加简洁. lambda 表达式的语法 lambda 表达式由参数,->,以及函数体三部分组成.其实函数体可以是表达式,也可以是语句.语句应该包含在{} 里,而表达式不能. lambda 表达式举例 (List<String> list) -> list.isEmpty() // 布尔类型表达式 () -> new Apple

  • Java8 Lambda表达式详解及实例

    第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello runnable"); } }; ... thread.start(); 上面的例子如果改成使用Lambda就会简单许多: Runnable noArgs = ()->System.out.print

  • Java8新特性lambda表达式有什么用(用法实例)

    我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值.现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作(bulk operation),解开lambda最强作用的神秘面纱. 1.关于JSR335 JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其

随机推荐