lambda表达式

【Java基础】Java中的语法糖

吃可爱长大的小学妹 提交于 2019-12-01 07:01:01
目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with-resource Lambda表达式 Lambda表达式的语法 基本的Lambda例子(实现功能接口) 使用Lambdas排序集合 使用Lambdas和Streams 字符串对+号的支持 参考 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。 但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。所以真正支持语法糖的是Java编译器。 Java中的语法糖 switch支持String和枚举 泛型 自动装箱与拆箱 方法变长参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with-resource Lambda表达式 字符串+号。 switch对String和枚举类的支持 switch对枚举和String的支持原理其实差不多。switch原生支持只能支持比较整数类型。如果switch后面是String类型的话

Java8 Lambda表达式

吃可爱长大的小学妹 提交于 2019-12-01 06:18:58
简介 Lambda表达式是java8中的新特性,它支持将函数作为一个方法的参数 语法 (parameters) -> expression 或 (parameters) ->{ statements; } 实例 例子1 // 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y // 4. 接收2个int型整数,返回他们的和 (int x, int y) -> x + y // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) (String s) -> System.out.print(s) 例子2 public class Java8Tester { public static void main(String args[]){ Java8Tester tester = new Java8Tester(); // 类型声明 MathOperation addition = (int a, int b) -> a + b; // 不用类型声明 MathOperation subtraction = (a, b) -> a - b; // 大括号中的返回语句 MathOperation

java 8 中lambda表达式

给你一囗甜甜゛ 提交于 2019-11-30 00:38:04
使用场景: a) 用lamaba表达式来代替原始的foreach循环。 b) 用Lamaba表达式来写完成一个匿名内部类,能少写好多的大括号,让代码看起来清爽不少。 c) 最主要的,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 1.遍历操作map public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "1"); map.put(2, "2"); map.forEach((key, value) -> { log.info("{}:{}", key, value); }); }    来源: https://www.cnblogs.com/ynhk/p/11541794.html

java8 Lambda表达式

徘徊边缘 提交于 2019-11-29 19:16:41
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; } //显式指明返回值 可见λ表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。 下面这个例子里的λ表达式没有参数,也没有返回值(相当于一个方法接受0个参数,返回void,其实就是Runnable里run方法的一个实现): () -> { System.out.println("Hello Lambda!"); } 如果只有一个参数且可以被Java推断出类型,那么参数列表的括号也可以省略: c -> { return c.size(); } 2. λ表达式的类型(它是Object吗?) λ表达式可以被当做是一个Object(注意措辞)。λ表达式的类型,叫做“目标类型(target type)”。λ表达式的目标类型是“函数接口(functional interface)”,这是Java8新引入的概念。它的定义是:一个接口,如果只有一个显式声明的抽象方法

JAVA8 lambda表达式

半城伤御伤魂 提交于 2019-11-29 18:31:55
1.获取实体类对象中某一个字段转为List List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList()); 2.根据单个字段字段去除重复 List<User> userList = users.stream() .collect( Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(user ->user.getName()))), ArrayList::new)); 3.根据多个字段去除重复 List<User> userList = users.stream() .collect( Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(user -> user.getName()+";"+user.getId()))), ArrayList::new)); 4.根据某个字段分组 users.stream().collect(Collectors.groupingBy(User::getName)) 来源:

lambda表达式

我怕爱的太早我们不能终老 提交于 2019-11-29 06:28:40
import java.util.*; /** * * @author shirley * @date 2019/9/4 */ public class Main { public static void main(String[] args) { List<Integer> list = Arrays.asList(4,2,7,3,6); Collections.sort(list,(o1,o2)->{ if(o1<o2){ return -1; } if(o1>o2){ return 1; } return 0; }); System.out.println(list); } } 结果:[2, 3, 4, 6, 7] 来源: https://blog.csdn.net/weixin_44683617/article/details/100540746

JDK各个版本的新特性jdk1.5-jdk8

南楼画角 提交于 2019-11-28 23:45:19
JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言。今天先为大家介绍一下JDK1.5版本到JDK1.7版本的特性。希望能给予帮助。 JDK1.5新特性: 1.自动装箱与拆箱: 自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。 自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。 自动装箱,只需将该值赋给一个类型包装器引用,java会自动创建一个对象。 自动拆箱,只需将该对象值赋给一个基本类型即可。 java——类的包装器 类型包装器有:Double,Float,Long,Integer,Short,Character和Boolean 2.枚举 把集合里的对象元素一个一个提取出来。枚举类型使代码更具可读性,理解清晰,易于维护。枚举类型是强类型的,从而保证了系统安全性。而以类的静态字段实现的类似替代模型,不具有枚举的简单性和类型安全性。 简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。 复杂用法:Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法

Java8常用Lambda表达式

走远了吗. 提交于 2019-11-28 15:40:25
List<User> users=new ArrayList<>(); //用户集合中返回userId字段为空的集合 List<User> users1 = users.stream().filter(obj -> obj.getUserId().equals("")).collect(Collectors.toList()); //用户集合中返回userId字段为空的集合中的第二个开始查 返回第一个用户对象 User user = users.stream().filter(obj -> obj.getUserId().equals("")).skip(1).findAny().get(); //用户集合中返回userId字段为空的集合中返回第一个用户对象 User user1 = users.stream().filter(obj -> obj.getUserId().equals("")).findFirst().get(); //用户集合中返回userId字段为空的集合中返回第一个用户对象(串行查询跟上面结果一样,并行查询返回最快回来的那个) User user2 = users.stream().filter(obj -> obj.getUserId().equals("")).findAny().get(); //根据年龄降序排序用户 不加reversed(

C#表达式树浅析

不羁的心 提交于 2019-11-28 12:34:00
一、前言 在我们日常开发中Lamba 表达式经常会使用,如List.Where(n=>Name="abc") 使用起来非常的方便,代码也很简洁,总之一个字就是“爽”。在之前我们总是用硬编码的方式去实现一些底层方法,比如我要查询用户“abc”是否存在,老的实现方式基本为:GetUser(string name ) ,可能下次我需要按用户登录账号来查询,于是又得写一个方法:GetUserByLogin(string loginCode ),我们认真想一下,如果能实现类似于集合查询那样只要写lambda 就能搞定,List.Where(n=>Name="abc"),List.Where(n=>LoginCode=="小A"),有了这样的想法,那我们也去了解一下lambda 表达式树的背后吧。 二、初识 表达式树关键字“Expressions”,我们在官方文档里面可以看到很多介绍,具体信息请查看微软官方文档库:https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.expressions?view=netcore-2.2;官方文档里面的信息量比较大,有几十个对象的介绍: 这里我不建议大家从头到尾的看一遍,大致浏览就好了,因为信息量太多了。首先我们新建一个控制台程序,框架版本选FX4.0以上或者Core 都行,引入命名空间: using

Lambda表达式底层分析

馋奶兔 提交于 2019-11-28 10:31:50
一、我们先看下C#代码下Lamdba表达式的写法   // <summary> /// 写入日志委托 /// </summary> /// <param name="message">消息</param> delegate void WriteLog(string message); class Program { static void Main(string[] args) { { WriteLog method = (message) => { Console.WriteLine(message); }; method.Invoke("写入日志测试1"); } { WriteLog method = (message) => { Console.WriteLine(message); }; method.Invoke("写入日志测试2"); } Console.ReadKey(); } }    二、再通过反编译工具查看 internal class Program { [CompilerGenerated] [Serializable] private sealed class <>c { public static readonly Program.<>c <>9 = new Program.<>c(); public static WriteLog <>9__0_0;