java基础第11期——Stream流、方法引用、junit单元测试
1.Stream流
Stream流与io流是不同的东西,用于解决集合类库已有的弊端,
1.1 获取Stream流:
Collection集合的Stream方法,注意Map集合要经过转化
default Stream<E> stream()
返回以此集合作为源的顺序 Stream 。
Stream<T> filter(Predicate<? super T> predicate)
返回由过滤条件过滤后的流。
void forEach(Consumer<? super T> action)
对此流的每个元素执行操作。即逐一处理。
long count()
返回此流中的元素数。
Stream<T> skip(long n)
在丢弃流的第一个n元素后,返回由该流的n元素组成的流。
static <T> Stream<T> of(T... values)
返回其元素是指定值的顺序排序流。
代码演示:
public class demo01 {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<>();
        array.add("人类");
        array.add("天地鬼神");
        array.add("天堂");
        array.stream()
                .filter(name->name.startsWith("天"))//首字符
                .filter(name->name.length() == 4)//长度
                .forEach(name-> System.out.println(name));//对每个元素进行输出操作
        //获取流
        //List、Set、Map集合转换Stream流
        List<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();
        Set<String> set = new HashSet<>();
        Stream<String> stream1 = set.stream();
        Map<String,String> map = new HashMap<>();
        Set<String> set1 = map.keySet();//获取键存储到Set集合中
        Stream<String> stream2 = set1.stream();
        Collection<String> values = map.values();//获取值存储到Set集合中
        Stream<String> stream3 = values.stream();
        //获取键值对,(键与值的映射关系entrySet)
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //把数组转换为Stream流
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
        //参数是可变参数可以传递数组
        Integer[] arr  = {1,2,3,4,5};
        Stream<Integer> arr1 = Stream.of(arr);
        String[] arr2 = {"a","bb","ccc"};
        Stream<String> arr21 = Stream.of(arr2);
    }
}
1.2 处理流的方法:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
将一个流中的元素映射到另一个流中
long count();
统计流中元素的个数
Stream<T> limit(long maxSize)
截取流中前maxSize个元素,参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作。;
Stream<T> skip(long n):
skip方法获取一个抛弃前n个元素的新流
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
将两个流组合形成一个新流
代码演示:
public static void main(String[] args) {
        Stream<String> stringStream = Stream.of("1", "2", "3");
        //map方法的参数通过方法引用,将字符串类型转换成为了int类型,并自动装箱为Integer类对象
        Stream<Integer> integerStream = stringStream.map((String str) -> Integer.parseInt(str));
        System.out.println(integerStream.count());
        //综合练习
        ArrayList<String> arr = new ArrayList();
        arr.add("kiana");
        arr.add("key");
        arr.add("may");
        arr.add("mace");
        arr.add("bronya");
        Stream<String> k = arr.stream().filter(s -> s.startsWith("k")).limit(1);
        k.forEach(System.out::println);
  }
2. 方法引用
方法引用,如果lambda方法体的内容已经存在于某个方法的实现中,
那么我们就不需要再将具体的内容重复写入lambda中,而是直接通过方法引用的写法.自动推导参数和重载
函数式接口的抽象方法的执行体就是lambda的代码块部分,抽象方法参数传给引用的方法
使用方法引用符::
定义一个接口:
@FunctionalInterface
interface Printable{
    void print(String str);
}
一个类:
class test{
    void printUpperCase(String str){
        System.out.println(str.toUpperCase());
    }
}
引用:
public static void main(String[] args) {
        //通过对象引用已经存在的方法,不必再将方法重复写入lambda中
        test test1 = new test();
        printString(test1::printUpperCase);
}
2.1 通过类名引用静态方法
@FunctionalInterface
interface math{
    int calc(int num);
}
public class demo04 {
    public static void main(String[] args) {
        //
        method(-2,Math::abs);
//        method(-2,(a)->Math.abs(a));
    }
    private static void method(int num,math obj){
        System.out.println(obj.calc(num));
    }
}
2.2 子类通过super引用父类成员方法:
@FunctionalInterface
interface itf{
    void method();
}
class father{
    void mt1(){
        System.out.println("hello");
    }
}
public class demo05 extends father {
    @Override
    void mt1() {
        System.out.println("hi");
    }
    private static void mt2(itf obj){
        obj.method();
    }
    public void mt3() {
        mt2(super::mt1);
    }
    public static void main(String[] args) {
        new demo05().mt3();
    }
}
2.3 使用this关键字引用本类中的方法,被引用方法不可以是静态方法
@FunctionalInterface
interface test4{
    void want();
}
public class demo06 {
    private void mt1(){
        System.out.println("个子不算矮");
    }
    public static void mt2(test4 obj1){
        obj1.want();
    }
    public void mt3() {
        mt2(this::mt1);
    }
    //主方法
    public static void main(String[] args) {
        new demo06().mt3();
    }
}
2.4 类的构造器引用
- 由于构造器的名称与类名相同,可能修改,所以用 类名::new 的格式表示.
 
interface if4{
    person mt2(String name);
}
class person{
    private String name;
    public person(String name){
        this.name = name; }
    public String getName(){
        return name; }
    public void setName(String name){
        this.name = name; }
}
public class demo07 {
    private static void mt3(String name,if4 obj){
        System.out.println(obj.mt2(name).getName());
    }
    public static void main(String[] args) {
        mt3("love",person::new);
    }
}
3. junit单元测试
- 测试分类
 
1.黑盒:不写代码,检测程序输出的是否是期望值
2.白盒:写代码,关注程序运行具体过程
注:junit:白盒测试
3.1 使用流程
1.定义一个测试类:***Test
2.定义测试方法,
方法名:Test***
返回值:void
参数:空
3.测试方法添加@Test注解
4.导入junit依赖环境
- 结果判断: 断言
 
Assert.assertEquals(期望值,实际值)
运行时红色表示错误,绿色表示通过
- 两个注解
 
1.@Before:
用于资源申请,被注解的方法自动执行于所有测试方法之前
2.@After
用于资源释放,被注解的方法自动执行于所有测试方法之后
3.2 演示
样本:
public class demo08Test {
    public int add(int a, int b){
        return a+b;
    }
}
测试类:
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
//注意不是public会报错
public class demo09 {
    @Before
    public void before(){
        System.out.println("before");
    }
    @Test
    public void TestCalculate(){
        System.out.println("test");
        demo08Test calculate = new demo08Test();
        int result = calculate.add(1, 3);
        //期待2,对比结果
        Assert.assertEquals(2,result);
    }
    @After
    public void after(){
        System.out.println("after");
    }
}
												
											java基础第11期——Stream流、方法引用、junit单元测试的更多相关文章
- java基础(10)---stream流
		
一.stream的应用场景 for遍历的冗余场景: stream的写法: 二.获取Stream流的常用方式 三.Stream的map映射方法 更简单的写法: 四.Stream的filter过滤方法 ...
 - Stream流方法引用
		
一.对象存在,方法也存在,双冒号引用 1.方法引用的概念: 使用实例: 1.1先定义i一个函数式接口: 1.2定义一个入参参数列表有函数式接口的方法: 1.3调用这个入参有函数式接口的方法: lamb ...
 - Java 8 新特性之 Stream 流基础体验
		
Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...
 - Java基础语法(11)-面向对象之关键字
		
title: Java基础语法(11)-面向对象之关键字 blog: CSDN data: Java学习路线及视频 1.this this是什么 它在方法内部使用,即这个方法所属对象的引用: clas ...
 - 2015年12月28日 Java基础系列(六)流
		
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
 - Java基础系列-equals方法和hashCode方法
		
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
 - JAVA基础知识之IO——IO流(Stream)的概念
		
Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...
 - 【Java基础】11、java方法中只有值传递,没有引用传递
		
public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...
 - JAVA基础知识|lambda与stream
		
lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...
 
随机推荐
- freemarket+itext+springboot将html静态页面渲染后导出为pdf文件
			
1.maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf& ...
 - OpenStack  (haproxy)
			
openstack部署脚本 链接:<https://pan.baidu.com/s/1BTp_tGNC6ZWwVmKkhwivgw > 提取码:jxuz haproxy 官网:< h ...
 - 使用timeout-decorator为python函数任务设置超时时间
			
需求背景 在python代码的实现中,假如我们有一个需要执行时间跨度非常大的for循环,如果在中间的某处我们需要定时停止这个函数,而不停止整个程序.那么初步的就可以想到两种方案:第一种方案是我们先预估 ...
 - c++nullptr(空指针常量)、constexpr(常量表达式)
			
总述 又来更新了,今天带来的是nullptr空指针常量.constexpr(常量表达式)C++的两个用法.Result result_fun = nullptr;constexpr stati ...
 - 二进制方法-部署k8s集群部署1.18版本
			
二进制方法-部署k8s集群部署1.18版本 1. 前置知识点 1.1 生产环境可部署kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式 kuberadm Kubea ...
 - BZOJ 3675: 序列分割 (斜率优化dp)
			
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
 - HDU 3449 依赖背包
			
这道题虽然水水的,但是还是成功地给我增加了10多个WA. 最开始拿着题,一看,依赖背包嘛~直接DFS树形DP嗨起来,甚至连内存都没有算一下,3MLE: 然后又仔细看了一下题,没有必要用树形背包来做嘛, ...
 - HDU - 1059  背包dp
			
题目: 有两个小朋友想要平分一大堆糖果,但他们不知道如何平分需要你的帮助,由于没有spj我们只需回答能否平分即可. 糖果大小有6种分别是1.2.3.4.5.6,每种若干颗,现在需要知道能不能将这些糖果 ...
 - 错误: 未能完成程序集的安装(hr = 0x8007000b)。探测终止。
			
解决方案:VS中"工具"->"选项"->"Web项目"->"对网站和项目使用IIS Express的64位版& ...
 - Typora Themes自定义
			
Typora Themes自定义 Typora 支持css样式,自定义主题十分方便,修改自己的css文件,再放入其themes文件夹,重启Typora,即可看到自定义主题. Typora 官网,自定义 ...