一、Lambda表达式

1.语法格式

Lambda是匿名函数,可以传递代码。使用“->”操作符,改操作符将lambda分成两部分:

左侧:指定了 Lambda 表达式需要的所有参数

右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能,也就是实现接口方法的代码

// 语法格式一:无参、无返回值  
@Test  
public void test1() {  
    Runnable runable = () -> System.out.println("hello lambda!");  
    runable.run();  
}  
  
// 语法格式二:有一个参、无返回值  
@Test  
public void test2() {  
    Consumer<String> consumer = (args) -> System.out.println("hello!"  
           + args);  
    consumer.accept("lambda");  
}  
  
// 语法格式三:有多个参、有返回值,并且有多条执行语句,用大括号包围  
@Test  
public void test3() {  
   Comparator<Integer> com = (x, y) -> {  
       System.out.println("hello lambda!");  
       return Integer.compare(x, y);  
    };  
    int rs = com.compare(2, 2);  
    System.out.println(rs);  
}  
  
// 语法格式四:右侧如果只有一条执行语句,可以省略大括号和return  
@Test  
public void test4() {  
   Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y);  
   int rs = com.compare(2, 2);  
   System.out.println(rs);  
}  

注:lambd可以省略接口参数类型,java编译器会根据上下文进行类型推断

2.函数式接口

(1)只包含一个抽象方法的接口,称为函数式接口,可以在任意函数式接口上使用 @FunctionalInterface 注解,lambda需要函数式接口的支持。

(2)java8内置四大核心函数式接口:

Consumer<T>消费型接口:void accept(T t)

@Test  
public void test2() {  
    Consumer<String> consumer = (args) -> System.out.println("hello!"  
           + args);  
    consumer.accept("lambda");  
}  

Supplier<T>供给型接口:T get()

@Test
public void test5() {
List<Integer> rs=getNumList(6,() -> (int)(Math.random()*100));
System.out.println(rs);
} public List<Integer> getNumList(int size,Supplier<Integer> sup){
List<Integer> list=new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
Integer e=sup.get();
list.add(e);
}
return list;
}

Function<T, R>函数型接口:R apply(T t)

@Test  
public void test6() {  
Function<String, Integer> fun=(str)->str.length();  
int len=fun.apply("lambda");  
System.out.println(len);  
}  

Predicate<T>断定型接口:boolean test(T t)

@Test  
public void test7() {  
Predicate<String> check=(str)->str.equals("lambda");  
boolean rs=check.test("lambda");  
System.out.println(rs);  
}  

3.方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!( lambda要实现抽象方法的参数列表,必须与方法引用的方法参数列表保持一致! )。
方法引用:使用操作符 “ ::” 将对象或类和方法的名字分隔开来。

三种主要使用情况:

对象::方法名

PrintStream ps=System.out;  
Consumer<String> consumer =  ps::println;  
consumer.accept("lambda");

类::静态方法名

Comparator<Integer> com = Integer::compare;  
int rs = com.compare(2, 2);  
System.out.println(rs);  

类::实例方法名(前提条件:lambda参数列表的第一个参数是实例方法的调用者,第二个参数是实例方法的入参)

BiPredicate<String,String> check=(str1,str2)->str1.equals(str2);  
BiPredicate<String,String> check1=String::equals;  

4.构造器引用

与函数式接口相结合,自动与函数式接口中方法兼容(需要调用的构造器方法参数列表要与函数式接口中方法的参数列表一致)

格式: ClassName::new

5.数组引用

格式: type[] :: new

二、Stream API

1.说明解释

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。流(Stream)是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算! ”

注意:
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

2.Stream 操作步骤

(1)创建Stream

①可以通过Collection系列集合提供的stream()或者parallelStream()获得

List<String> list=new ArrayList<String>();  
Stream<String> stream=list.stream();  

②可以通过Arrays的静态方法stream()获得数组流

Person[] ps=new Person[10];  
Stream<Person> stream=Arrays.stream(ps); 

③可以通过Stream的静态of()

Stream<String> steam=Stream.of("aa","bb","cc"); 

④可以使用静态方法 Stream.iterate() 和Stream.generate(), 创建无限流

(2)中间条件操作

说明:多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。

①筛选与切片
        filter——接收 Lambda , 从流中排除某些元素。
        limit——截断流,使其元素不超过给定数量。
        skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
        distinct——筛选去重,通过流所生成元素的 hashCode() 和 equals() 去除重复元素

List<Person> personList = Arrays.asList(  
                new Person("李四", 20, 10),  
                new Person("张三", 40,30),  
                new Person("王五", 28, 15),  
                new Person("赵六", 60, 60),  
                new Person("赵六", 60, 60),  
                new Person("赵六", 60, 60),  
                new Person("田七", 8,2)  
        );  
          
        Stream<Person> stream=personList.stream();          
        stream.filter((p)->p.getAge()>20)//过滤保留age>20  
        .limit(5)//只取前两个  
        .skip(1)//跳过前一个,返回剩下的  
        .distinct()//去重,自动定义对象去重要重写equals和hashcode  
        .forEach(System.out::println); 

②映射
        map——接收 Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
        flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

Stream<Person> stream=personList.stream();          
stream.map((p)->p.getName())//提取name,组成新的Stream流  
     .forEach(System.out::println);  

③排序
        sorted()——自然排序(Comparable)
        sorted(Comparator com)——定制排序

(3)执行操作

查找与匹配
        allMatch——检查是否匹配所有元素,返回boolean
        anyMatch——检查是否至少匹配一个元素,返回boolean
        noneMatch——检查是否没有匹配的元素,返回boolean
        findFirst——返回第一个元素
        findAny——返回当前流中的任意一个元素
        count——返回流中元素的总个数
        max——返回流中最大值
        min——返回流中最小值

 

  

  

 

Android 手机卫士5--手机防盗的更多相关文章

  1. Android 手机卫士--导航界面1的布局编写

    本文地址:http://www.cnblogs.com/wuyudong/p/5943005.html,转载请注明出处. 本文实现导航界面1的布局的实现,效果如下图所示: 首先分析所使用的布局样式: ...

  2. Android 手机卫士--设置界面&功能列表界面跳转逻辑处理

    在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...

  3. Android 手机卫士--确认密码对话框编写

    本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...

  4. Android 手机卫士--阶段小结1

    本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本 ...

  5. Android 手机卫士--参照文档编写选择器

    本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...

  6. Android 手机卫士--安装过程中点击回退按钮

    本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再 ...

  7. Android 手机卫士--签名文件说明&包名说明

    在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务 ...

  8. Android 手机卫士--xutils说明与下载方法使用

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词) ...

  9. Android 手机卫士--弹出对话框

    在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private ...

随机推荐

  1. 每天一个linux命令(28):tar命令

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具.linux中最流行的tar是麻雀虽小,五脏俱全,功能强大. tar命令可以为linux ...

  2. IBM appscan 9.0破解版分享

    简介:IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评 ...

  3. Javascript学习记录——数组去重

    var arr = [1, 2, 3, 5, 5, '45', '45', 4, 1, '1', '2'] for (var i = 0; i < 10000; i++) { arr.push( ...

  4. ASPNET_WEBAPI快速学习02

    这部分内容的学习,已经放了大半年时间了,果断补充上,尽早将过去遗留的老技术坑都补上.首先将介绍服务幂等性的概念和相关解决方案,这部分也将是本文的理解难点,由于WebAPI是一种Restful风格服务的 ...

  5. 记录asp.net在IE10下事件丢失排错经过

    最近项目中运用了地区三级联动,用的是最普通的DropDownList回发来实现的,如下图 一直用着都挺好的,可最近客户最近新换了台服务器,我把网站迁移过去就有了问题,三级联动失效了. 首先申明一点,这 ...

  6. 12个免费的 Twitter Bootstrap 后台模板

    在互联网上提供很多免费的 Bootstrap 管理后台主题.所有你需要做的就是将它们下载并安装它们,这真的不是什么难事.问题是如何寻找到能够完美符合您的网站需求的主题.当然,你可以自己制作自定义的主题 ...

  7. 【Android】Android应用安装失败及无法打开

    以下是我个人遇到过的APP无法安装的一些问题: 无法安装应用: 手机系统版本过低:不符合应用支持的最低版本.(比如应用只支持Android 4.0以上的手机,而手机是Android2.3的)解决方案: ...

  8. NODE.JS学习的常见误区及四大名著

    NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...

  9. Windows Azure Virtual Machine (1) IaaS用户手册

    <Windows Azure Platform 系列文章目录> Azure IaaS用户手册  - Azure IaaS相关技术- Azure虚拟机成本分析- 创建Azure虚拟机- 使用 ...

  10. Elasticsearch集群配置以及REST API使用

    ES安装与启动 在官网下载压缩包,解压后直接运行bin目录下的.bat文件即可.下载地址戳这里. ES配置集群 Elasticsearch配置集群很简单,只要配置一个集群的 名称 ,ES就会自动寻找并 ...