首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

搞明白 Java 的通配符泛型

的时候,E 的类型被统一为 Number,因为不知道你传进去的到底是 List 还是List,返回的时候都可以向上转到 Number。...因为你有可能传 List List List,而 e 如果是一个 Number,是传不进子类的参数类型的,比如现在传进来一个 List,那函数就变成 add(Integer e),你不能传一个 Number...比如对于一个 ArrayList ,我们可以传一个 Consumer 也可以传一个 Consumer,表示的意思是,既然你可以消费 XXX 的父类,那么,我也可以把你的子类传给你。 的副作用是比较大的,适用于给多种不同的子类的集合做归约操作,比如有 List List,你可以写一个函数统一处理 List 。...因为 PECS 最大的问题是它只告诉你用通配符泛型的情景下你应该如何选择,没有告诉你什么时候用 通配符泛型,什么时候不用。

52620

谈谈 Swift 中 Sequence(序列) 、Collection(集合) 和高阶函数

刚初始化的时候头尾节点均指向同一节点 当插入一个节点后,头指针不变,尾指针指向它的下一个节点 当满了的时候尾指针指向nil 遍历读取的时候,头指针+1 下面我们实现一个可以插入元素和读取元素的结构体:...在函数内部我们可以看到: 首先创建一个同样带下的ContiguousArray数组 让遍历原数组中的元素,对每个元素执行闭包中的操作 最后将执行完闭包的元素放到新创建的集合中返回 在研究flatMap的时候知道可选值也有一个对应的...,对集合中的元素尝试执行闭包函数 然后拼接在开始创建的集合中 看完函数的实现我们也就理解了为什么一个二维数组调用flatMap函数后会返回一个一维数组。...在LazyMapSequence的扩展中,访问元素的时候在执行闭包函数,这也就是我们获取元素的时候才会得到相应的结果,返回的集合中,存储的是原有的集合数据。是真正的懒加载。...所以lazy实质上是保存当前集合和对应的操作,然后在访问元素的时候,执行对应的操作。

2.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    scala flatMap个人心得

    大家好,又见面了,我是你们的朋友全栈君。 scala flatMap个人心得 前几天,用scala写了一个小程序。...意思大概就是将f这个函数应用到Seq里的所有元素,并将函数产生的集合里的元素取出来,组成一个新的集合。...然后返回这个新的集合 举个栗子: def getWords(lines: Seq[String]): Seq[String] = lines flatMap (line => line split "...先将e中的两个元素:”I love”,”coding scala”,变成Seq(”I”,”love”)和Seq(“coding”,”scala”),然后从那两个Seq中取得元素,组成一个新的Seq(“I...所以flatMap就是将函数产出的集合串接在一起。 值得注意的是: flatMap最后返回的集合是以谁调用他为准的,比如Seq调用flatMap,返回的就是Seq。List就是返回List.

    66020

    如何在 Scala 中科学地操作 collection(一)集合类型与操作

    collections.png scala.collection.mutable 中的所有集合类 可变集合,顾名思义,意味着你可以修改,移除或者添加一个元素。 ?...列表 List List 继承至 Seq,集合中的元素是可以重复的。...e.g. scala> val l = List(1, 1, 2, 2, 3, 5) l: List[Int] = List(1, 1, 2, 2, 3, 5) 所以当集合内的元素是可重复的时候,可以选择...e.g. scala> val s = Set(1, 1, 2, 2, 3, 5) s: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5) 所以当集合内的元素是不可重复的时候...collect 接受的是一个偏函数,对集合中每个元素应用该函数,返回应用后的元素所组成的列表,可以将 collect 看作是先做 filter 操作再做 map 操作: 场景二中的 collect 操作可以看作是

    1.2K61

    到处是map、flatMap,啥意思?

    不要过分使用 我也不知道这些函数是从什么时候流行起来的,但它们与函数编程的关系肯定是非常密切的。好像是2004年的Scala开始的。 没什么神奇的,它们全部是语法糖,作用是让你的程序更简洁。...它有时候真的是一个简单的数组,有时候是存在于多台机器的分布式数组。在下文中,我们统称为数组流。 我们简单分为两类。...Action 转换,典型的特点就是lazy。 只有action执行的时候,才会真正参与运算。所以,你可以认为这些转换动作是一套被缓冲的操作。典型的函数如:map、flatMap等。...flatMap flat是扁平的意思。它把数组流中的每一个值,使用所提供的函数执行一遍,一一对应。得到元素相同的数组流。只不过,里面的元素也是一个子数组流。...它代表一个不可变、可分区、其内元素可并行计算的集合。 它是分布式的,但我们可以看下一个WordCount的例子。

    2.5K30

    2021年大数据Spark(十五):Spark Core的RDD常用算子

    flatMap 算子: flatMap(f:T=>Seq[U]) : RDD[T]=>RDD[U]),表示将 RDD 经由某一函数 f 后,转变为一个新的 RDD,但是与 map 不同,RDD...中的每一个元素会被映射成新的 0 到多个元素(f 函数返回的是一个序列 Seq)。  ...第一点:增加分区数目 当处理的数据很多的时候,可以考虑增加RDD的分区数  第二点:减少分区数目 其一:当对RDD数据进行过滤操作(filter函数)后,考虑是否降低RDD分区数目 其二:当对结果RDD...Scala集合中的聚合函数 回顾列表List中reduce聚合函数核心概念:聚合的时候,往往需要聚合中间临时变量。...函数的第一个参数是累加器,第一次执行时,会把zeroValue赋给累加器。

    84330

    2021年大数据Spark(十三):Spark Core的RDD创建

    并行化集合 由一个已经存在的 Scala 集合创建,集合并行化,集合必须时Seq本身或者子类对象。...{SparkConf, SparkContext} /**  * Spark 采用并行化的方式构建Scala集合Seq中的数据为RDD  *  - 将Scala集合转换为RDD  *      sc.parallelize...{SparkConf, SparkContext} /**  * 从HDFS/LocalFS文件系统加载文件数据,封装为RDD集合, 可以设置分区数目  *  - 从文件系统加载  *      sc.textFile...,可以指定文件目录,可以使用通配符指定。...小文件读取      在实际项目中,有时往往处理的数据文件属于小文件(每个文件数据数据量很小,比如KB,几十MB等),文件数量又很大,如果一个个文件读取为RDD的一个个分区,计算数据时很耗时性能低下,使用

    51530

    Scala 【 11 Scala的集合体系结构 】

    Scala的集合体系结构 ​ Scala 中的集合体系主要包括:Iterable、Seq、Set、Map。 ​ 其中 Iterable 是所有集合 trait 的根 trait。...这个结构与Java的集合体系非常相似。 ​ Scala 中的集合是分成可变和不可变两类集合的,其中可变集合就是说,集合的元素可以动态修改,而不可变集合的元素在初始化之后,就无法修改了。...Seq 下包含了 Range、ArrayBuffer、List 等子 trait。其中Range 就代表了一个序列,通常可以使用 “1 to 10” 这种语法来产生一个 Range。...Set ​ Set 代表一个没有重复元素的集合,将重复元素加入 Set 是没有用的。 ​ 而且 Set 是不保证插入顺序的,也就是说,Set 中的元素是乱序的。...Scala 的集合类的 map、flatMap、reduce、reduceLeft、foreach 等这些函数,就是高阶函数,因为可以接收其他函数作为参数。 ​

    41120

    Flink学习——Flink编程结构

    而在进行这些操作前,需要根据需求初始化运行环境 执行环境 Flink 执行模式分为两种,一个是流处理、另一个是批处理。再选择好执行模式后,为了开始编写Flink程序,需要根据需求创建一个执行环境。...它会根据你的环境来选择。 如果你在IDE中的本地环境中执行,那么它将启动本地执行环境。 否则,如果正在执行JAR,则Flink集群管理器将以分布式方式执行该程序。...当系统仅追加文件内容时使用FileMonitoringFunction.WatchType.PROCESS_ONLY_APPENDED 当系统不仅要重新处理文件的追加内容而且还要重新处理文件中的先前内容时...基于Collection fromCollection(Seq) :从Seq创建数据集。 集合中的所有元素必须属于同一类型。 fromCollection(Iterator) :从迭代器创建数据集。...而sink当然跟source一样也是可以自定义的。 因为Flink数据要保存到myslq,是不能直接保存的,所以需要自定义一个sink。不定义sink可以吗?

    1.2K10

    前端问答:flat()和flatMap()有啥不同?

    想象一下,你手里有一盒装满了各种小盒子的快递箱。每个小盒子里可能又装着更小的盒子,甚至更小的盒子里还有东西。这时候,你想要快速找到所有的小东西,但是不想一个一个打开这些小盒子。...结果就是你可以直接看到2和3,4和[5, 6]这些元素,但是更里面的[5, 6]还得再打开。...什么是flatMap()方法? flatMap()方法可以说是数组操作中的一把“魔法棒”。它的作用是先对数组中的每个元素进行处理,然后将处理后的结果“压扁”成一个新的数组。...你可以把它想象成是map()和flat()(深度为1)这两个方法的组合体,一步到位完成映射和压平的操作。...如果你的数组嵌套层数较深,而你需要完全展开它们,你还是需要使用flat()并指定合适的深度。例如,flat(2)可以压平两层嵌套,而flatMap()则只能处理一层。

    15510

    【Spark常用算子合集】一文搞定spark中的常用转换与行动算子

    只会记录在数据集上要应用的操作.当需要返回结果给 Driver 时, 才会执行这些操作, 这个特性叫做 惰性求值 2.每一个 Action 运行的时候, 所关联的所有 Transformation RDD...算子 flatMap算子的作用是将一行数据拆分成多个元素,并将所有元素放在一个新的集合中,返回一个新的RDD。...它与map算子的区别在于,map算子只是将一行数据拆分成一个元素,并将其放在新的集合中, 而flatMap算子可以将一行数据拆分成多个元素,并将所有元素放在一个新的集合中。...中的一个重要的转换操作,它的作用是对每个key对应的元素进行分组,然后将分组后的结果以key-value的形式返回, 其中key是原来的key,value是一个迭代器,迭代器中存放的是key对应的所有元素...subtract 可以从一个RDD中减去另一个RDD中的元素,以得到一个新的RDD。

    2.4K50

    scala(十三) 集合

    不可变集合继承图 image.png Set、Map是Java中也有的集合 Seq是Java没有的,我们发现List归属到Seq了,因此这里的List就和Java不是同一个概念了 我们前面的for...Map体系有一个SortedMap,说明Scala的Map可以支持排序 IndexSeq和LinearSeq的区别: 1.IndexSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合...带-是删除元素 一个+/-与两个+/-的区别 一个+/-是添加/删除单个元素 两个+/-是添加/删除一个集合所有元素 冒号在前、冒号在后、不带冒号的区别 冒号在前是将元素添加到集合末尾 冒号在后是将元素添加到集合最前面...,集合元素类型) => 集合元素类型): 从左向右聚合 reduce中函数在第一次计算的时候,函数第一个参数的值 = 集合第一个元素 reduce中函数在第N次计算的时候,函数第一个参数的值 = N...,集合元素类型) => 集合元素类型): 从右向左聚合 reduceRight中函数在第一次计算的时候,函数第二个参数的值 = 集合最后一个元素 reduceRight中函数在第N次计算的时候,函数第二个参数的值

    48120

    Spark RDD详解 -加米谷大数据

    RDD正是解决这一缺点的抽象方法 (2)RDD的具体描述RDD(弹性数据集)是Spark提供的最重要的抽象的概念,它是一种有容错机制的特殊集合,可以分布在集群的节点上,以函数式编 操作集合的方式,...因为Spark是用scala语言实现的,Spark和scala能够紧密的集成,所以Spark可以完美的运用scala的解释器,使得其中的scala可以向操作本地集合对象一样轻松操作分布式数据集。...)返回一个新的数据集,由经过func函数后返回值为true的原元素组成 flatMap(func)类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素...) flatMap(func)类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素) sample(withReplacement, frac...flatMap(func)类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素)

    1.5K90

    详解ECMAScript2019ES10新属性

    ,其实不然,flatMap有个强大的功能是可以在map的时候添加和删除元素,这个无论是map还是filter都没有这个功能。...要想删除某一个元素只需要在mapper函数里面返回一个空的数组[], 而增加元素只需在mapper函数里面返回一个长度大于1的数组,具体可以看下面的例子: // 假如我们想要删除掉原数组里面所有的负数,...) { } // 可是有时候,你确实用不到这个error对象,于是你会写这样的代码 try { ... } catch (_) { ... } // ECMAScript2019后,你可以直接这样写了...,而你又忽略了错误处理,所以你永远不会知道这个typo。...,可是非稳定的排序不能保证他们两个的顺序在排序后保持不变 // ECMAScript2019后,Array.sort将是一个稳定的排序,也就是说它可以保证Sean和Ken两个人的顺序在排序后不变 //

    27710

    23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)

    关键是看这个函数是否在类中定义,在类中定义就是方法,所以Scala 方法是类的一部分。Scala 中的函数则是一个完整的对象,可以赋给一个变量。不过,在scala中,方法和函数是可以相互转化的。...另外要注意的是,由于模式匹配是按顺序匹配的,因此变量模式和通配符模式要写在表达式的最后面。 类型匹配模式 可以匹配输入变量的类型。...Testfalsetruetrue 六、集合操作 常用集合 通过下面的代码,可以了解常用集合的创建方式 // 定义整型 List,其元素以线性方式存储,可以存放重复对象。...val x = Set(1,3,5,7) // 定义 Map,把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。... ch)) 从结果可以看出来是先做的map,然后做的flatten 7)forall & exists forall是对整个集合做判断,当集合中的所有元素都满足条件时,返回true。

    1.1K20

    【译】对RxJava中-repeatWhen()和-retryWhen()操作符的思考

    Notification Handler 你可以通过一个叫做notificationHandler的函数来实现重试逻辑。...简化后,它包括三个部分: Func1像个工厂类,用来实现你自己的重试逻辑。 输入的是一个Observable。 输出的是一个Observable。...这就是为什么使用了通配符作为泛型类型:这仅仅是个通知(next, error或者completed),一个很重要的通知而已。...换句话说就是,它的每一次调用你都需要决定是否需要重订阅。 当订阅发生的时候,工厂Func1被调用,从而准备重试逻辑。那样的话,当onError被调用后,你已经定义的重试逻辑就能够处理它了。...你必须对Observable做出反应,然后基于它发送事件;你不能只返回一个通用泛型流。

    2.1K30

    【译】对RxJava中.repeatWhen()和.retryWhen()操作符的思考

    Notification Handler 你可以通过一个叫做notificationHandler的函数来实现重试逻辑。...简化后,它包括三个部分: Func1像个工厂类,用来实现你自己的重试逻辑。 输入的是一个Observable。 输出的是一个Observable。...这就是为什么使用了通配符作为泛型类型:这仅仅是个通知(next, error或者completed),一个很重要的通知而已。...换句话说就是,它的每一次调用你都需要决定是否需要重订阅。 当订阅发生的时候,工厂Func1被调用,从而准备重试逻辑。那样的话,当onError被调用后,你已经定义的重试逻辑就能够处理它了。...你必须对Observable做出反应,然后基于它发送事件;你不能只返回一个通用泛型流。

    1.2K20

    跟我学 Java 8 新特性之 Stream 流(五)映射

    因为在很多时候,将一个流的元素映射到另一个流对我们是非常有帮助的。...比如有一个包含有名字,手机号码和钱的数据库构成的流,可能你只想要映射钱这个字段到另一个流,这时候可能之前学到的知识就还不能解决,于是映射就站了出来了。...另外,如果你希望对流中的元素应用一些转换,然后把转换的元素映射到一个新流里面,这时候也可以用映射。...);//note4 } 其中 //note1 处是无法打印元素的,使用map()打印元素的方式在 //note2 ,原因也在注释中交待了,但是使用了flatMap()方法后,直接就可以打印了 //...其实在流API这一块中,大家单单掌握概念是没什么用的,一定要去实战了,一个项目里面,集合框架这种东西用得还是特别多的,用到集合框架的大部份情况,其实都可以考虑一下用Stream流去操作一下,不仅增加效率

    59420

    flatMap

    ——《论语》 在Stream中有这么一个函数 它和map不一样的是,map你输入多少个,输出就是多少个 例如我要生成一个集合,装着26个小写字母和26个大写字母 用flatMap可以一行实现 List...我只能说,我这篇博客是写flatMap,所以不要杠,我知道Stream.concat可以换成Stream.of 而且,你下面这种方式生成58个元素,其中浪费了6个元素 而我上面的方式只用26个元素就生成了...extends R> 然后现在你可能有点懵,这两个泛型干嘛的 第一个泛型? super T你甚至可以忽略掉?...super去看,直接把他认为是泛型T,而这个泛型T,就是我们原来的元素 简单来说,它就是你的入参,就是你的集合里的每一个元素 就是.flatMap(i -> Stream.concat(Stream.of...extends,表示你的返回值需要Stream类型 这个R可以和T一样,也可以不一样 例如我这里就是一样的,都是String类型,我使用Steam.of以及Stream.concat函数去将我们的元素转换成

    42610
    领券