精华内容
下载资源
问答
  • lambda表达式for循环的搭配用法

    千次阅读 2020-06-14 21:04:59
    lambda表达式for循环的搭配用法 开篇-遇到的问题 给出一个值 x ,分别计算 x 与 0~5 之间各个数的和 # 给出一个值 x ,分别计算 x 与 0~5 之间各个数的和 res=[lambda x,i=i:x+i for i in range (6)] print(res)...

    lambda表达式与for循环的搭配用法

    1. 开篇-遇到的问题
      给出一个值 x ,分别计算 x 与 0~5 之间各个数的和
    #  给出一个值 x ,分别计算 x 与 0~5 之间各个数的和
    res=[lambda x,i=i:x+i for i in range (6)]
    print(res)       #得到返回 x+i 函数的五个地址
    for f in res:    #循环遍历每个地址
        print(f(2))  #对每个遍历到的函数 传递参数 x=2
    #2 3 4 5 6 7
    
    

    问题一:lambda表达式,在内部嵌套for循环,怎么用的?如果for循环在外部又会怎么样?
    问题二:lambda表达式外部加上[]的用法

    1. 知识回顾

    语法:lambda 变量1,变量2,…,变量N : 使用变量的表达式

    注意 :(1)可以无参,调用时不可以在参数表中赋值;
    t = lambda : Tru
    >>True
    (2) 无参,直接返回值
    等效为:
    def f():
    return x
    (3) 有参,调用时直接给变量赋值
    (4) 后面表达式不能使用未定义的变量,可以使用匿名函数外定义的变量

    1. lambda表达式在for循环内部,和append搭配
      代码:输出 0~4 所有数的的幂
    li=[]
    for x in range(5):
         li.append(lambda x: x**2)
         print(li[0](1))
    #li得到的是个列表,里面存的可不是计算出来的数,而是五个函数地址
    '''
        print(li) 
    输出五个函数的地址:
    [<function <lambda> at 0x000001A3D5EE59D8>]
    [<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>]
    [<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>, <function <lambda> at 0x000001A3D5EE5AF8>]
    [<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>, <function <lambda> at 0x000001A3D5EE5AF8>, <function <lambda> at 0x000001A3D5EE5B88>]
    [<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>, <function <lambda> at 0x000001A3D5EE5AF8>, <function <lambda> at 0x000001A3D5EE5B88>, <function <lambda> at 0x000001A3D5EE5C18>]
    
    '''
    
        # li,[]内是地址的索引位置
    
    print(li[1](2))  #4
        # print(li[0](2))  #4
        # print(li[4](3))  #9
    
    • 首先直接输出执行:print(li)
      li 得到的是个列表,但是里面存的不是计算出来的幂,而是五个函数地址
      预计是得到 0,1,2, 9,16
    • 原因是:循环的 x 并没有传递给 lambda 里面的 x ,只是让它生成多个 x**2 函数

    总结:
    lambda在for循环内部,和append搭配时,for循环不是为了给函数传递参数,只是为了生成多个函数。

    问:什么时候for循环可以给lambda参数那?

    *其实for在lambda内部可以给参数,但是,即使给出参数也不一定都会参与lambda表达式中的计算并得结果。

    有以下两种情况: 放在()中的lambda与for搭配 放在[]中的lambda与for搭配 *

    一、放在小括号()中,参数由for循环给出,搭配append

    
    li=[]
    li.append(lambda : x for x in range(5)) # 是否能得到0,1,2, 9,16 ???
    #print(li)
    #[<generator object <genexpr> at 0x0000021D62ADEA48>]
    

    分析:
    1.内部 lambda : x for x in range(5)这是函数

    2,加上小括号()!!!

     # res=(lambda : x  for x in range(5))
       # print(res)
      输出:<generator object <genexpr> at 0x000001AEE73EEAC8>
    

    因此:(lambda : x for x in range(5))这种形式,返回值是一个generator(生成器)

    1. 整体,加入空列表后,在列表的内部就存了一个生成器
     # li=[]
     # li.append(lambda  : x  for x in range(5))
     用next()调用一下
     print(next(li[0])()) # 0
     print(next(li[0])()) # 1
     print(next(li[0])()) # 2
    当地址变为1时:报错
    print(next(li[1])())      # IndexError: list index out of range
    

    二、放在[ ]中、参数由for循环给出

    li = [lambda :x  for x in range(5)]
    

    首先直接输出:print(li)
    输出的是五个函数(return x )地址

    注意:不是生成器,与上面别混淆,(lambda :x for x in range(5))这种形式,返回值是一个generator(生成器)
    [<function <listcomp>.<lambda> at 0x0000022AC3BE0558>,
     <function <listcomp>.<lambda> at 0x0000022AC3BE05E8>, 
     <function <listcomp>.<lambda> at 0x0000022AC3BE0678>, 
     <function <listcomp>.<lambda> at 0x0000022AC3BE0708>, 
     <function <listcomp>.<lambda> at 0x0000022AC3BE0798>]
    

    分析:
    首先:lambda :x for x in range(5)仍然是一个函数(返回 x)
    再者,加上中括号后:输出的是五个函数(return x )地址
    再执行 print(li0),就会输出x的值

    print(li[0]())    # 4
    print(li[1]())    # 4
    

    因此:直接套 [ ]也是输出不了循环的各个数值的计算结果

    展开全文
  • lambda表达式for循环写法

    万次阅读 2018-11-04 15:17:19
    package com.sinosoft.workflow; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Demo { public static void main(String[] args) { ...
    package com.sinosoft.workflow;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Demo {
        public static void main(String[] args) {
            //list的遍历
            List<String> books = new ArrayList<String>(3);
            books.add("TEST1");
            books.add("TEST2");
            books.add("TEST3");
            books.forEach(obj -> System.out.println("测试:" + obj));
            //map的遍历
            Map maps = new HashMap();
            maps.put(1, "test1");
            maps.put(2, "test2");
            maps.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));
        }
    
    }

     

    展开全文
  • java 8的新特性之一就是lambda表达式,其中lambda表达式的foreach循环最为引人注目,现比较下lambda表达式foreach和普通for循环的性能测试。代码如下: public static void main(String[] args){ List<...

    java 8的新特性之一就是lambda表达式,其中lambda表达式的foreach循环最为引人注目,现比较下lambda表达式foreach和普通for循环的性能测试。代码如下:

     

    public static void main(String[] args){
           List<String> list = new ArrayList<>();
           for(int i =0;i<10000;i++){
               list.add(String.valueOf(i));
           }
            long begin = System.currentTimeMillis();
            for(Object s : list){
                s.toString();
            }
            long end = System.currentTimeMillis();
            System.out.println("普通for循环耗时"+(end-begin)+"ms");
            begin = System.currentTimeMillis();
            list.forEach(e->{
                e.toString();
            });
            end = System.currentTimeMillis();
            System.out.println("普通lambda表达式foreach耗时"+(end-begin)+"ms");
            begin = System.currentTimeMillis();
            list.stream().forEach(e->{
                e.toString();
            });
            end = System.currentTimeMillis();
            System.out.println("单管道stream耗时"+(end-begin)+"ms");
            begin = System.currentTimeMillis();
            list.parallelStream().forEach(e->{
                e.toString();
            });
            end = System.currentTimeMillis();
            System.out.println("多管道stream耗时"+(end-begin)+"ms");
        }


     测试结果:

    普通for循环耗时1ms
    普通lambda表达式foreach耗时40ms
    单管道stream耗时51ms
    多管道stream耗时38ms
    为何lambda表达式的性能比普通的还差,我猜测是因为:list.parallelStream()是并发处理的,大量的线程上下文切换导致性能下降。如何证明?那就把for循环里的处理时间设置长一点吧,设置成如下代码: 

     

    public static void main(String[] args){
           List<String> list = new ArrayList<>();
           for(int i =0;i<10000;i++){
               list.add(String.valueOf(i));
           }
            long begin = System.currentTimeMillis();
            for(Object s : list){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                s.toString();
            }
            long end = System.currentTimeMillis();
            System.out.println("普通for循环耗时"+(end-begin)+"ms");
            begin = System.currentTimeMillis();
            list.stream().forEach(e->{
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e1) {
                     e1.printStackTrace();
                }
                e.toString();
            });
            end = System.currentTimeMillis();
            System.out.println("单管道stream耗时"+(end-begin)+"ms");
            begin = System.currentTimeMillis();
            list.parallelStream().forEach(e->{
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                e.toString();
            });
            end = System.currentTimeMillis();
            System.out.println("多管道stream耗时"+(end-begin)+"ms");
        }


    测试结果:

    普通for循环耗时10104ms
    普通lambda表达式foreach耗时10144ms
    单管道stream耗时10084ms
    多管道stream耗时2512ms
    由此可见,对于耗时的操作用lambda表达式的for循环,如数据库的IO操作,多线程充分利用CPU资源,传统方式跟单管道stream的处理效率相差无几,多管道parallelStream的处理效率最高;对于不太耗时的操作使用普通for循环,比如纯CPU计算类型的操作,单线程性能更高,减少上下文切换的开销。
    --------------------- 
    作者:zhou_fan_xi 
    来源:CSDN 
    原文:https://blog.csdn.net/zhou_fan_xi/article/details/84315203 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不如自己用for循环来的快。...
  • Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新...一、利用流和Lambda表达式对List集合进行处理1.List集合遍历// item:可以是任意值。类似于for循环中的循环值dataList.forEach(item -> {//设置...
  • 循环语句中使用Lambda表达式时需要注意一些潜在的问题,先看代码: &gt;&gt;&gt; def makeActions(): acts = [] for i in range(5): # Tries to remember each i acts.appen...
  • 一个需要注意的地方看下面的代码:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;namespaceMyCsStudy{classProgram{staticvoidMain(string[]args){List>...for(inti=0;i{list...
  • for forEach 循环及Lambda表达式使用 for循环 for循环语句一般代码结构如下: for(初始化; 判别式; 更新) { 代码语句 } 执行流程: 先进行初始化; 初始化之后执行判别式,如果判别式结果为真,会执行代码块内容,...
  • java8 .stream().filter() 代替for循环 lambda表达式

    万次阅读 多人点赞 2019-01-17 16:44:05
    先说一下lambda表达式: lambda 表达式的语法格式如下: (parameters) -&gt; expression (parameters) -&gt;{ statements; } //或者这种 Lambda 表达式的简单例子: // 1. 不需要参数,返回值为 5 ()...
  • 然后,用for循环将i封装进lambda表达式,并加入到该list中,最后,用foreach循环输出结果。 2、因为lambda表达式实质就是个委托,也就指向一个匿名函数,所以,在foreach输出的时候,使用item()来调用它,让它所指向...
  • List<DepartmentMember> departmentMemberList = departmentMemberMapper.selectByCondition(condition);... // lambda表达式:数据量多的时候性能更好 departmentMemberList.forEach( ...
  • IEnumerable<Rect> rectlist3 = rectlist.Select(rect =>newRect(rect.X + 2000, rect.Y, rect.rect.Width, rect.rect.Height)); 转载于:https://www.cnblogs.com/gaoxianzhi/p/4084328.html
  • 一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序、过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照。刚开始写写是打基础,但写的多了,各种乏味,非过来人不能感同身受。今天,...
  • lambda表达式有它自己的优点:(1)简洁,(2)易并行计算。尤其适用于遍历结果,循环计算数值或者赋值的时候非常方便。缺点: (1)若不用并行计算,很多时候计算速度没有比传统的 for 循环快。 (2)不...
  • python中for循环中使用lambda表达式遇到的坑 在接手这个项目后,由于主要使用的语言都是python,故本着已有语言基础以用到就现学现用的想法使用python。于是就过了一遍基础语法,然后就开始了现学现用的过程,一开始...
  • 首先看看传统的增强for循环 for (String a : list) { System.out.println(a); } 再看看JDK8中的增强for循环 list.forEach(System.out::println) 首先明确一点,lambda表达式引用非抽象方法时,需要通过一个...
  • 这时候你回想一下你之前如果用过lambda表达式,有没有这种操作:就是在一个for循环里面进行声明了一个lambda表达式。 我觉得这种操作一般用lambda的人,都可能会有。 就是类似这种写法: for (int j = 0; j ; j++) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 513
精华内容 205
关键字:

lambda表达式for循环