stream and lambda

java 8 Stream 流式编程

一、stream 概要与使用场景

stream 概要

  • stream 流式编程是用于对集合迭代器的增强,使之能完成更高效的去和操作(过滤、排序、统计分组)或者大批量数据操作。此外 steam 与 lambada 表达式结合后编码效率大大提高,并且可读性更强。

  • stream 里面有多线程

  • 产生背景

    • 获取所有红色苹果的总重量,如果用sql其实非常好实现,为什么不直接在关系数据库中实现呢?

      select sum(a.wight) from apple as a where a.color='red' // 获取所有红色苹果重量
      select a.color,sum(a.weight) from apple as a group by color;
      
    • 传统的java ee项目数据源比较单一,可以这样做。但是现在的项目数据源多样化:关系数据库,Nosql,Redis,ElasticSearch等这是就需要我们从个数据源中汇总数据进行统计。这在stream出现前只能通过便利实现,非常繁琐

Lambda 表达式详解

  • Lambda 简介 :

    • 也称闭包,推动java 8 发布最重要的特性,Lambada 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。使用Lambada表达式可以使函数变得更加间接紧凑。
  • 在这里插入图片描述

    • 这个实现其实在底层式一样的,lambda表达式在编译的时候会生成匿名内部类

    • 只能有一个方法 -> 函数式接口 -> @FunctionalInterface -> object下的方法除外

    • 函数式接口才能使用lambda,即才能把函数作为参数传递进去

    • 说明:new Thread 时需要传入一个匿名内部类,这个匿名内部类是runable接口,他是一个函数式接口,所以可以将他替换为lambda表达式进行传输,传输的参数其实就是run方法的参数,箭头后面就是run方法的实现。

    •  [

    • 说明:Formatter是一个函数式接口,print方法有一个参数是这个函数式接口,所有在嗲用这个方法时传递的参数就可以将此函数式接口替换为lambda表达式,而lambda表达式是一个函数,所以这个函数其实就是实现的函数式接口里面的format方法。这其实就是一个匿名内部类,即new 出来一个Formatter但是没有名字,所以他的this是继承来的。

    在这里插入图片描述

stream

  • 流的生成 :stream()

  • 流不可重复使用 :生成一个流stream1后,添加一个节点filter,这时stream1+filter形成了一个新的流stream2,原来的stream1作废,不能再stream1后再添加节点,只能在stream2后再添加节点。即stream流是不允许有分叉的。

  • 中间节点和中止节点:看stream类中方法,如果返回的是stream,则一般就是中间节点;否则是中止节点

    • 中间节点可以有很多个,用来构造pipeline,且是懒节点,只有调用中止节点时才会执行
    • 中止节点只能有一个,调用中止节点时会立刻执行。
  • 流的执行过程是一个数据一个数据的传递,而不是直接将整个数组list传递过去在这里插入图片描述

  • filter :过滤节点,中间节点,传入箭头函数,参数a代表stream流中每次传进来的数据(其实就是i函数的参数),箭头就相当于将a传入方法体中,因为只有一条语句,可以省略方法体的{}和return。如果方法体中的判断条件返回true,则将此数据加入新生成的数组中。

  • map :映射节点,中间节点,也是传入箭头函数,将过滤下来的apple传进去后,返回颜色string类型,在接下来的节点中都是string类型的数据。

  • distinct():去重,将返回的所有的数据进行比较去重,只留下不一样的元素。

  • peek():中间节点,用来执行传入的函数

  • forEach():中止节点,与peek()作用一样,只不过这是个中止节点。单纯用来执行传入的箭头函数。

  • collect():采集,常用,中止节点。可以用于以下用途:

    1. list :collect(Collectors.toList())
    2. map:collect(Collectors.toMap(a->a.getColor(), a->a, (a1,a2)->a1)) // 第一个参数是key,第二个参数是value,如果有重复的key应该添加第三个参数进行merge,如果有两个apple a1,a2,则在里面选一个a1
    3. group by
    4. 数组
    5. 求出最大值
    6. 求任意值
  • stream debug

    • idea 自带工具 Trace Current Stream Chain

额外学习

Map<String,List<Apple>> maps new Hash<>();
//如果不存在这个key,则new 一个这个key,并返回其value对应的数据类型
List<apple> lsit = maps.computeIfAbsent(apple.getColor(),key->new ArrayList<>());
  • 要想真正搞懂一个框架,必须先去了解设计模式

  • coderead.cn 源码阅读网

  • mybatis 和 dubbo里面的动态代理都说明使用了同一种设计模式,为了实现透明化,屏蔽底层,从而简化我们的使用

  • lambda study link

  • stream study link

资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值