lambda表达式

生成器

别等时光非礼了梦想. 提交于 2019-12-05 04:18:56
生成器 一. 生成器的定义: 生成器的本质就是迭代器 ,在python社区中,大多数时候都把迭代器和生成器是做同一个概念。生成器和迭代器,唯一的不同就是:迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来的,(比如文件句柄,iter([1,2,3])。 生成器是需要我们自己用python代码构建的工具 。最大的区别也就如此了。 二、生成器的构成 生成器表达式 通过生成器函数 python内置函数或模块提供 三、生成器函数 def func(): print(11) return 22 ret = func() print(ret) 将函数中的return换成yield,这样func就不是函数了,而是一个生成器函数 def func(): print(11) yield 22 ret = func() print(ret) 注意:结果 <generator object func at 0x031E5CB0> 执行这个函数的时候,就不再是函数的执行了,而是获取这个生成器对象. 生成器的本质就是迭代器,迭代器如果取值,生成器就如何取值 四、生成器的取值 def func(): print(11) yield 22 qener = func() # 这个时候函数不会执行,而是获取到生成器(就是那个内存地址!!) ret = next(qener) # 这个时候函数才会执行

还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

▼魔方 西西 提交于 2019-12-04 21:10:02
摘自: https://www.cnblogs.com/niumoo/p/11880172.html 还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下 Java 8 新特性系列文章索引。 Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda 表达式、函数接口了解一下 前言 我们都知道 Lambda 和 Stream 是 Java 8 的两大亮点功能,在前面的文章里已经介绍过 Lambda 相关知识,这次介绍下 Java 8 的 Stream 流操作。它完全不同于 java.io 包的 Input/Output Stream ,也不是大数据实时处理的 Stream 流。这个 Stream 流操作是 Java 8 对集合操作功能的增强,专注于对集合的各种高效、便利、优雅的 聚合操作 。借助于 Lambda 表达式,显著的提高 编程效率 和 可读性 。且 Stream 提供了 并行计算 模式,可以简洁的编写出并行代码,能充分发挥如今计算机的多核处理优势。 在使用 Stream 流操作之前你应该先了解 Lambda 相关知识,如果还不了解,可以参考之前文章: 还看不懂同事的代码?Lambda 表达式、函数接口了解一下 。 1. Stream 流介绍 Stream

lambda表达式(一)---基础知识

妖精的绣舞 提交于 2019-12-03 21:19:43
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新引入的概念。它的定义是:一个接口,如果只有一个显式声明的抽象方法

再探Lambda表达式

浪尽此生 提交于 2019-12-03 15:37:07
Lamdba表达式 主要作用替代匿名内部类 达到简化代码的操作 Lamdba表达式 在对象中的使用 Employee类 需求1:得到年龄大于18的员工信息 定义方法 测试类 结果 需求2:得到薪水大于10000的员工信息 定义方法 测试类 结果 总结以上方法 代码重复较多 开始优化使用函数式接口 1.自定义一个函数式接口 作用 模仿 java8中Predicate 函数式接口 该接口定义一个泛型 返回布尔值 2.定义一个公用方法 (两个需求的方法能调用) 自定义函数式接口 MyPredicate 泛型放入Employee ( 作用是后面使用Lamdba表达式,更加说明了Lamdba表达式使用依赖函数式接口 ) 3.test01 test02 调用公用方法 使用匿名内部类 传入 准备的数据 list new 函数式接口 在匿名内部类的方法中 实现各自需求 (age>18 salary>10000) 结果 3.使用Lamdba表达式 替代匿名内部类 具体替换内容 test01 与 test 04 替换相同 test02 与 test03替换内容 Lamdba表达式 替换 匿名内部类 1 package com.wf.zhang.java8.lamdba; 2 3 public class Employee { 4 5 private String name; 6 7 private

Java8新特性——Lambda表达式-1

社会主义新天地 提交于 2019-12-03 10:12:57
一、抛出需求   超市中挑选苹果,挑选条件多样化。   示例:找出绿色并且重量等于150的苹果,找出红色并且重量小于120苹果。 1、苹果类 public class Apple { private String color; private int weight; public Apple(String color, int weight) { this.color = color; this.weight = weight; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } @Override public String toString() { return "color=" + this.color + ",weight=" + this.weight; } } 二、实现方案   采用策略模式,实现数据筛选。 1、查找苹果类 public class FindApple { public static List

.NET进阶篇05-Linq、Lambda表达式

﹥>﹥吖頭↗ 提交于 2019-12-03 10:08:37
知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂 内容目录 一、Lambda表达式 1、匿名方法 2、Lambda表达式 二、Linq概述 三、查询操作符 1、linq初见 2、常用查询操作符 筛选 排序 分组 连接 合并 分页 聚合 转换 四、并行Linq 五、表达式树 1、认识表达式目录树 2、拼装表达式树 3、应用 六、小结 一、Lambda表达式 1、匿名方法 使用delegate的时候很多时候没必要使用一个普通方法,因为这个方法只有 delegate会用,并且只用一次 ,这时候使用匿名方法最合适。 匿名方法就是 没有名字的方法 。示例中就是用一个匿名方法创建委托实例,我们无需在写一个具名方法给委托,使代码更简洁和可读。匿名方法也是在调用时执行,在myDele(1,"test")处调用。(用反编译器看一下还是会生成一个具名方法的,只不过在编译器内部使用)。 delegate bool MyDelegate(int i, string s);MyDelegate myDele = delegate (int i, string s){ Console.WriteLine($"我是匿名方法,参数值{i},{s}"); return true;};bool b = myDele(1, "test"); 2、Lambda表达式 函数式编程,在C#3.0开始

Lambda表达式

匿名 (未验证) 提交于 2019-12-03 00:27:02
刚开始用vue或者react,很多时候我们都会把ES6这个大兄弟加入我们的技术栈中。但是ES6那么多那么多特性,我们真的需要全部都掌握吗?秉着二八原则,掌握好常用的、有用的这个可以让我们的开发快速起飞。 接下来我们就聊聊ES6那些可爱的新特性吧。 在ES6之前,我们都是用var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如: function aa () { if (bool) { var test = 'hello man' } else { console.log(test) } } 以上的代码实际上是: function aa () { var test // 变量提升 if (bool) { test = 'hello man' } else { //此处访问test 值为undefined console.log(test) } //此处访问test 值为undefined } 所以不用关心bool是否为true or false。实际上,无论如何test都会被创建声明。 接下来ES6主角登场: 我们通常用 let 和 const 来声明, let 表示变量、 const 表示常量。 let和const都是块级作用域。 怎么理解这个块级作用域? 1. 在一个函数内部 2. 在一个代码块内部 说白了

Lambda表达式-stream流

匿名 (未验证) 提交于 2019-12-02 23:55:01
流与集合相比的优点 流的延迟执行特点 集合、映射或数组获取流 常用的流操作 输出语句的方法引用 使用类和数组的构造器引用 public class StreamDemo { //流控制,打印 @Test public void test1 () { List < String > data = new ArrayList < String >(); data . add ( "张无忌" ); data . add ( "着迷" ); data . add ( "张三丰" ); data . add ( "百里一组" ); data . add ( "二蛋二狗子" ); data . stream (). filter ( s -> s . startsWith ( "张" )) . filter ( s -> s . length () == 3 ). forEach ( System . out :: println ); } //获取流 @Test public void test2 () { List < String > data = new ArrayList < String >(); Stream < String > stream = data . stream (); HashMap < String , Object > data2 = new HashMap

Lambda表达式mapToDouble.sum精度问题

匿名 (未验证) 提交于 2019-12-02 23:42:01
public static void main(String[] args) { List<Double> doubles = Arrays.asList(new Double(3.3), new Double(3.3), new Double(3.3)); double sum = doubles.stream().mapToDouble(Double::doubleValue).sum(); System.out.println(sum);// 9.899999999999999 System.out.println(formatDigit(sum,2));// 9.9 System.out.println(formatDigit_down(sum, 2)); // 9.89 List<Double> doubles1 = Arrays.asList(new Double(1.1), new Double(1.1), new Double(1.1)); double sum1 = doubles1.stream().mapToDouble(Double::doubleValue).sum(); System.out.println(sum1);// 3.3000000000000003 System.out.println(formatDigit(sum1,2));// 3.3

Java8简明学习之Lambda表达式

匿名 (未验证) 提交于 2019-12-02 21:53:52
函数式接口    就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为lambda表达式。   之前已有的函数式接口:   java.lang.Runnable   java.util.concurrent.Callable   java.util.Comparator   java.io.FileFilter   1.8新增的函数式接口:   java.util.function包下   Predicate<T>――接收 T 并返回 boolean (常用)   Consumer<T>――接收 T,不返回值 (常用)   Function<T, R>――接收 T,返回 R (常用)   Supplier<T>――提供 T 对象(例如工厂),不接收值   UnaryOperator<T>――接收 T 对象,返回 T   BinaryOperator<T>――接收两个 T,返回 T lambda表达式   lambda表达式的语法由参数列表、箭头符号 -> 和函数体组成。函数体既可以是一个表达式,也可以是一个语句块。   eg: (int x, int y) -> x + y (表达式)   eg:(Integer e) -> {     double sqrt = Math.sqrt(e);     double log = Math.log(e