java8 lambda表达式的一些用法

用 lamdba 表达式操作 对象集合的比较 优雅。代码也比较简洁。 希望大家掌握(可以避免写foreach 循环)。

下面是实例代码(入门级,需要高级应用,自己得百度或者研究了)

/**
 * Project Name:test
 * File Name:myTest.java
 * Package Name:test
 * Date:2016年8月15日下午5:39:50
 * Copyright (c) 2016, [email protected] All Rights Reserved.
 *
*/

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * ClassName:myTest Function: TODO ADD FUNCTION. Date: 2016年8月15日 下午5:39:50
 *
 * @author lgy
 * @since JDK 1.8
 */
public class myTest {

	public static void main(String[] args) {

                //初始对象并准备集合数据
		myObject obj1 = new myObject();
		obj1.setX(1);
		obj1.setY(1);
		obj1.setText("a");

		myObject obj2 = new myObject();
		obj2.setX(2);
		obj2.setY(2);
		obj2.setText("a");

		myObject obj3 = new myObject();
		obj3.setX(3);
		obj3.setY(3);
		obj3.setText("a");

		myObject obj4 = new myObject();
		obj4.setX(4);
		obj4.setY(4);
		obj4.setText("d");

		myObject obj5 = new myObject();
		obj5.setX(5);
		obj5.setY(5);
		obj5.setText("d");

		List<myObject> ls = new ArrayList<myObject>();
		ls.add(obj1);
		ls.add(obj2);
		ls.add(obj3);
		ls.add(obj4);
		ls.add(obj5);

		/** 把x >= 3 的集合找出来 **/
		List<myObject> filter1 = ls.stream().filter(t -> t.x >= 3).collect(Collectors.toList());

		filter1.forEach(t -> System.out.println(t.x));

		/** 求text=d 的记录总数 **/
		long count = ls.stream().filter(t -> t.text == "d").count();

		System.out.println(count);

		/** 汇总x,y,及(x+y) 集合 **/

		// 求x总和
		int xSum = ls.stream().mapToInt(item -> item.x).sum();
		System.out.println(xSum);

		// 求y总和
		int ySum = ls.stream().mapToInt(item -> item.y).sum();
		System.out.println(ySum);

		// 求x+y总和
		int Sum = ls.stream().mapToInt(item -> item.x + item.y).sum();
		System.out.println(Sum);

		// 求x平均值
		double xAvg = ls.stream().mapToDouble(item -> item.x).average().getAsDouble();
		System.out.println(xAvg);

		// 根据text统计x,y的总和
		Map<String, Integer> group1 = ls.stream()
				.collect(Collectors.groupingBy(t -> t.text, Collectors.summingInt(t -> t.x)));

		System.out.println("a:" + group1.get("a"));
		System.out.println("d:" + group1.get("d"));

		// 过滤text=d 的记录,并把x值都设置为10
		ls.stream().filter(t -> t.text == "d").forEach(s -> s.setX(10));

		ls.forEach(t -> System.out.println(t.x));

	}
}

//实体对象类
public class myObject {
	int x;
	int y;
	String text;

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}
}

  这里有个提醒,filter 如果是比较两个字符串,最好用equals 操作。x.equals 操作必须保证 x 不是个空值,不然会包空指针异常。

时间: 2024-11-05 18:44:16

java8 lambda表达式的一些用法的相关文章

Java8 Lambda表达式深入学习(4) -- Java8实现方式

前几篇文章讨论了函数式接口和Lambda表达式语法.invokedynamic指令,以及Groovy2如何利用indy指令.本篇文章在前面几篇的基础之上,简要介绍Java8底层是如何实现Lambda表达式的. 示例代码 本文将以下面的代码为例展开讨论: import java.util.Arrays; import java.util.List; public class LambdaImplTest { public static void main(String[] args) { m1(A

java8 lambda表达式初接触

环境是jdk8 代码如下: package memTest; /** * Created by PC on 2014/8/5. */ public class LambdaOne { public static void test(){ new Thread(()-> System.out.print("hi") ).start(); } public static void main(String[] args) { new LambdaOne().test(); } } ja

深入学习Java8 Lambda表达式 -- 从函数式接口说起

希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论.FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那么它就是一个FI.为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解.举个简单的例子,Runnable接口就是一个FI,下面是它的源

Java8 Lambda表达式深入学习(2) -- InvokeDynamic指令详解

为了更好的支持动态类型语言,Java7通过JSR292给JVM增加了一条新的字节码指令:invokedynamic.之后,JVM上面的一些动态类型语言,比如Groovy(2.0+)和JRuby(1.7.0+)都开始支持invokedynamic.不过让人意外的是,为动态语言量身定制的invokedynamic指令,居然也被用到了Java8的Lambda表达式(JSR335)实现上.本文会对invokedynamic(以下简写做indy)指令做出详细解释. 测试代码 Java7以及更早版本的Jav

Java8 Lambda表达式应用案例 -- 单线程游戏服务器+异步数据库操作

前段时间我们游戏服务器的开发环境升级到了Java8,这两天我又把服务器的线程模型重新设计了一下,用上了Lambda表达式.Lambda表达式确实能够大幅简化Java代码,特别是丑陋不堪的匿名内部类,这篇文章主要就是想和大家分享这一点. 线程模型 首先简单介绍一下我们游戏服务器的线程模型,大致如下图所示: Netty线程池只处理消息的收发,当Netty收到消息之后,会交给游戏逻辑线程处理.由于是单线程在处理游戏逻辑,所以每一个消息必须很快处理完,也就是说,不能有数据库等耗时操作,不然逻辑线程很可能

Java8 Lambda表达式详解手册及实例

先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下Java8的新特性.Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了. 现在进入正题Java8的Lambda,首先看一下发音 ([?l?md?])表达式.注意该词的发音,b是不发音的,da发[d?]音. 为什么要引入Lambda表达式 简单的来说,引入La

JAVA8 Lambda表达式完全解析

JAVA8 新特性 在学习JAVA8 Lambda之前,必须先了解一下JAVA8中与Lambda相关的新特性,不然对于一些概念会感到比较陌生. 1. 接口的默认方法和静态方法 Java 8允许我们给接口添加一个默认方法,用default修饰即可.默认方法可以重写,也可以不用重写.这就是和抽象方法的区别,在用法上,没有其他区别. public interface IMyInterface { void onMethond(String str);//这是一个抽象方法 default String

Java8 Lambda表达式介绍

欢迎进入我的博客:blog.scarlettbai.com查看更多文章 Lambda表达式是Java8里的一个重要特性,发布这么久了,最近在学swift语言时发现了其中的闭包的概念其实跟Lambda表达式极其相似,于是今天整理一下Java8中的Lambda表达式,做个介绍. Lambda表达式其实就是提供Java编程中对于函数式编程的支持,在我们习惯了一切皆对象时,刚接触Lambda可能读起来比较费劲,但是习惯之后,其确实有助于代码的简洁,且在Python.swift等中都有类似于Lambda这

Java8 Lambda表达式入门

Lambda表达式的实质就是一个匿名函数.C#3.0引入了Lambda表达式,Java8也不甘示弱.Java8发布很久了,今天安装了JDK体验了Java8中的Lambda表达式. 首先看一个不适用Lambda表达式的例子. 比如我们要对一组字符串进行排序. public class Hello { public static void main(String[] args) { List<String> names = Arrays.asList("Tan", "