接触Lambda表达式的时候,第一感觉就是,这个是啥?我居然看不懂,于是开始寻找资料,必须弄懂它。

先来看一个案例:

@FunctionalInterface
public interface MyLamda {
void test1(String y);
}
import demo.knowledgepoints.Lambda.inf.MyLamda;

public class LambdaTest {
public static void main(String[] args) {
MyLamda m = (y) ->{ System.out.println("ss"+y);};
m.test1("s");
}
}

运行结果:

非Lambda方式:

import demo.knowledgepoints.Lambda.inf.MyLamda;

public class MyLamdaIml implements MyLamda {
@Override
public void test1(String y) {
System.out.println("ss"+y);
} public static void main(String[] args) {
MyLamdaIml myLamdaIml = new MyLamdaIml();
myLamdaIml.test1("s");
}
}

运行结果:

对比一下这两种方式:明显感觉使用Lambda表达式的更加简洁,由Java8引入,让我们一起来看看Lambda表达式的优点和不足。

1. Lambda表达式 语法:() -> {}; 通过上述案例我们看出,这个语法,就是替代了一个实现类和实现类中方法。

() 里面y为入参,{} 为方法体,类名被隐藏,方法名被隐藏。

2. Lambda表达式,接口(MyLamda)只能有且只有一个抽象方法。同时通过注解@FunctionalInterface可以做到编译的时候校验抽象方法,

不满足要求,给出编译报错。

3. (y) 可以写成 (String y),  {}里面可以省略 return。并且当方法中只有一行代码时,{} 也可以省略  ;() 里面只有一个参数() 也可以省略,

最简写法 y -> System.out.println("ss"+y);

知道Lambda表达式的概念,就要结合实际情况来使用。

案例:

Java的Runable接口 有注解@FunctionalInterface。

@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}

于是:

public class LambdaTest {
public static void main(String[] args) {
Runnable runnable = () -> System.out.println("线程启动");
Thread thread = new Thread(runnable);
thread.start();
}
}

运行结果:

import java.util.Arrays;
import java.util.List; public class LambdaTest {
public static void main(String[] args) {
System.out.println("Java 8之前:---------------------------------------------");
List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
System.out.println(feature);
}
System.out.println("Java 8之后:---------------------------------------------");
List features1 = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features1.forEach(n -> System.out.println(n));
System.out.println("使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,看起来像C++的作用域解析运算符");
features1.forEach(System.out::println);
}
}

运行结果:

Java8引入函数式编程,还提供了一个强大的工具类: java.util.function,该类非常适合对集合数据做过滤操作。

案例:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate; public class LambdaTest {
public static void main(String[] args) {
List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); System.out.println("第一个字符是J的字符串:");
filter(languages, (str)->str.startsWith("J")); System.out.println("最后一个字符是a的字符串:");
filter(languages, (str)->str.endsWith("a")); System.out.println("打印全部:");
filter(languages, (str)->true); System.out.println("都不打印:");
filter(languages, (str)->false); System.out.println("打印字符串长度超过4:");
filter(languages, (str)->str.length() > 4); } public static void filter(List<String> names, Predicate<String> condition) {
for(String name: names) {
if(condition.test(name)) {
System.out.print(name + " ");
}
}
System.out.println();
}
}

运行结果:

java.util.function.Predicate 允许将两个或更多的 Predicate 合成一个。它提供类似于逻辑操作符AND和OR的方法,名字叫做and()和or(),用于将传入 filter() 方法的条件合并起来。

案例:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate; public class LambdaTest {
public static void main(String[] args) {
List<String> names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
// 甚至可以用and()、or()逻辑函数来合并Predicate,
// 例如要找到所有以J开始,长度为四个字母的名字,你可以合并两个Predicate并传入
Predicate<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> fourLetterLong = (n) -> n.length() == 4;
names.stream().filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("字符串开头为“J” 且 字符长度等于4:" + n)); }
}

运行结果:

函数式编程概念map,改变元素值。

案例:

import java.util.Arrays;
import java.util.List; public class LambdaTest {
public static void main(String[] args) {
// 使用lambda表达式
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(n -> System.out.print(n+"; "));
System.out.println();
double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum + cost).get();
System.out.println("Total : " + bill);
}
}

运行结果:

案例:(filter 将满足条件的数据组成新的List)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; public class LambdaTest {
public static void main(String[] args) {
List<String> strList = Arrays.asList("abc","bcd","defg","jk");
List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
System.out.printf("原List : %s, 新list : %s", strList, filtered);
}
}

运行结果:

案例:(map() 对元素进行转化,distinct() 方法来对集合进行去重)

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; public class LambdaTest {
public static void main(String[] args) {
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));
System.out.println(G7Countries); List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
List<Integer> distinct = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
System.out.printf("原List : %s, 平方后的新List : %s", numbers, distinct);
}
}

运行结果:

案例:(最大,最小,和,平均)

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List; public class LambdaTest {
public static void main(String[] args) {
//获取数字的个数、最小值、最大值、总和以及平均值
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("List的最大值: " + stats.getMax());
System.out.println("List的最小值: " + stats.getMin());
System.out.println("List的之和: " + stats.getSum());
System.out.println("List的平均值: " + stats.getAverage());
} }

运行结果:

总结:

lambda表达式:

1. 简化代码。

2. 对集合操作方便。

缺点:

1. 局限强,不易进行复杂操作。

2. 调试不方便,出现问题,很难排查。

3. 数据量小,性能极差(慎用)。

参考:https://www.cnblogs.com/coprince/p/8692972.html

《Java基础知识》Java Lambda表达式的更多相关文章

  1. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  2. Java Lambda表达式入门

    Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...

  3. Java Lambda表达式入门[转]

    原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...

  4. Java Lambda表达式教程与示例

    Lambda表达式是Java 8中引入的一个新特性.一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类.lambda表达式的概念最初是在LISP编程语言中引入的. Java La ...

  5. Java Lambda表达式forEach无法跳出循环的解决思路

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

  6. 「Flink」使用Java lambda表达式实现Flink WordCount

    本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> < ...

  7. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  8. Java lambda 表达式常用示例

    实体类 package com.lkb.java_lambda.dto; import lombok.Data; /** * @program: java_lambda * @description: ...

  9. Java lambda 表达式详解(JDK 8 新特性)

    什么是 lambda 表达式 lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的"函数式编程". lambda 表达式的本质 ...

随机推荐

  1. webpackd学习的意义

    高速发展的前端技术,与浏览器支持的不相匹配.导致前端必须把前端比较先进的技术进行一层编码从而使得浏览器可以加载. 比如前端框架Vue,Angular,React.Less,Sass.TypeScrip ...

  2. mybatis源码学习(一) 原生mybatis源码学习

    最近这一周,主要在学习mybatis相关的源码,所以记录一下吧,算是一点学习心得 个人觉得,mybatis的源码,大致可以分为两部分,一是原生的mybatis,二是和spring整合之后的mybati ...

  3. Python文件和数据格式化(教程)

    文件是一个存储在副主存储器的数据序列,可包含任何数据内容. 概念上,文件是数据的集合和抽象,类似的,函数是程序的集合和抽象. 用文件形式组织和表达数据更有效也更加灵活. 文件包括两种形式,文本文件和二 ...

  4. Spring-boot(一)通过向导快速创建Spring-boot项目

    通过向导快速创建Spring-boot项目 创建步骤: 选择Spring Initializr 填写组织和模块名 选择对应的模块 注:这里左侧的模块比较多,玩家可以根据自己的实际需要自由选择,此处暂时 ...

  5. 都9012了,Java8中的日期时间API你还没有掌握?

    一,Java8日期时间API产生的前因后果 1.1 为什么要重新定义一套日期时间API 操作不方便:java中最初的Date不能直接对指定字段进行加减操作也不支持国际化,后来新增了Calendar,但 ...

  6. 如何运用DDD - 实体

    目录 如何运用DDD - 实体 概述 何为实体 似曾相识 你确定它真的需要ID吗 运用实体 结合值对象 为实体赋予它的行为 尝试转移一部分行为给值对象 愿景是美好的 现实是残酷的 总结 如何运用DDD ...

  7. 【JZOJ2019.10.07】模拟赛C组

    \(T1\) 题目描述&大意 贝西牛在每个点左右撞来撞去,不能出去 的情况下能活动(达到)的空间总共有多少? 思路 部分过程为: 反正就是能撞的撞 代码:

  8. Android实现图片一边的三角形边框

    在每一个图片的某一侧都可以展示出一个三角形的边框视图,就是咱们的三角形标签视图.这个视图在电商类APP当中比较常用,使用过ebay的同学应该都还记得有些商品的左上角或者右上角都会显示一个三角形的边框, ...

  9. 移动端开发语言的未来的猜想#华为云&#183;寻找黑马程序员#【华为云技术分享】

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

  10. 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作

    网站登录 现在各大平台在反爬虫功能上,可谓花样繁多.总结下来按照破解成功率排名,最高的是滑动解锁.其次是验证码数字.之后是一次点击对应的汉字,最后是想12306之前那种反人类的让你说那些是奶糖吧,哈哈 ...