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单元测试的更多相关文章

  1. java基础(10)---stream流

    一.stream的应用场景 for遍历的冗余场景:  stream的写法: 二.获取Stream流的常用方式 三.Stream的map映射方法 更简单的写法: 四.Stream的filter过滤方法 ...

  2. Stream流方法引用

    一.对象存在,方法也存在,双冒号引用 1.方法引用的概念: 使用实例: 1.1先定义i一个函数式接口: 1.2定义一个入参参数列表有函数式接口的方法: 1.3调用这个入参有函数式接口的方法: lamb ...

  3. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

  4. Java基础语法(11)-面向对象之关键字

    title: Java基础语法(11)-面向对象之关键字 blog: CSDN data: Java学习路线及视频 1.this this是什么 它在方法内部使用,即这个方法所属对象的引用: clas ...

  5. 2015年12月28日 Java基础系列(六)流

    2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流

  6. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  7. JAVA基础知识之IO——IO流(Stream)的概念

    Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...

  8. 【Java基础】11、java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  9. JAVA基础知识|lambda与stream

    lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...

随机推荐

  1. CCDictionary 用调试器查看问题

    if(dic->objectForKey("uid")) uid = dic->valueForKey("uid")->getCString( ...

  2. (14)Linux绝对路径和相对路径

    Linux 系统中,文件是存放在目录中的,而目录又可以存放在其他的目录中,因此,用户(或程序)可以借助文件名和目录名,从文件树中的任何地方开始,搜寻并定位所需的目录或文件. 说明目录或文件名位置的方法 ...

  3. STL_优先队列

    一.简介 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队. 元素 ...

  4. 2019牛客暑期多校训练营(第七场)H.Pair(数位dp)

    题意:给你三个数A,B,C 现在要你找到满足  A and B >C 或者 A 异或 B < C 的对数. 思路:我们可以走对立面 把既满足 A and B <= C 也满足 A 异 ...

  5. python爬取QQVIP音乐

    QQ音乐相比于网易云音乐加密部分基本上没有,但是就是QQ音乐的页面与页面之间的联系太强了,,导致下载一个音乐需要分析前面多个页面,找数据..太繁琐了 1.爬取链接:https://y.qq.com/ ...

  6. Codeforces ECR86 C. Yet Another Counting Problem(规律,区间)

    题意:给你两个正整数a和b,询问q次,每次给你一个区间[l,r],问[l,r]中有多少数字满足:x%a%b!=a%b%a. 题解:看公式无从下手的题,一般都是要找规律的.首先,我们知道,假如x%a%b ...

  7. CodeForces - 1201B Zero Array

    You are given an array a1,a2,-,ana1,a2,-,an. In one operation you can choose two elements aiai and a ...

  8. CodeCraft-20 (Div. 2) B. String Modification (字符串,规律)

    题意:有一个长度为\(n\)的字符串,你可以选取一个值\(k(1\le k \le n)\),然后遍历字符串,每次将区间长度为\(k\)的字符串反转,求反转后字典序最小的字符串,并输出\(k\)的值. ...

  9. nginx实现文件上传和下载

    nginx实现文件上传和下载 发布时间:2020-06-05 16:45:27 来源:亿速云 阅读:156 作者:Leah 栏目:系统运维 这篇文章给大家分享的是nginx实现文件上传和下载的方法.小 ...

  10. OpenStack Train版-6.安装nova计算服务(计算节点)

    安装nova计算服务(computel01计算节点 192.168.0.20)安装软件包 yum install centos-release-openstack-train -y yum insta ...