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 官网,自定义 ...