1229-方法引用(简化lambda)-stream流-单元测试-单例模式

这篇具有很好参考价值的文章主要介绍了1229-方法引用(简化lambda)-stream流-单元测试-单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 方法引用
  • stream流
  • 单元测试(junit)
  • 单例模式

方法引用

概念:对特殊的lambda简化的一种语法

使用时机:()-> {lambda体}

特殊的lambda:当lambda体只有1句代码,并且这句代码是在调用一个方法

java中的方法:

构造方法:new 构造方法()
实例方法:对象名.方法名()
类方法(静态方法):类名.方法名()

构造方法的方法引用的语法:类名 :: new(简化lambda调用构造方法)

/**
 * Dog类
 */
public class Dog {  
    private String name;
    private Integer age;

    public Dog() {
    }

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
/**
 * 创建Dog对象的接口
 */
public interface IFacotryDog {
    Dog create(String name,Integer age);
}

// 创建IFacotryDog对象的方法
		IFacotryDog ifd = (name,age) -> new Dog(name,age); // 创建函数接口对象
		Dog d = ifd.create("小可爱", 3);
        System.out.println(d);

		// 上面代码中lambda,可以使用构造方法的引用来简化
        // 创建IFacotryDog对象
        IFacotryDog ifd2 = Dog::new; // 类名:调用构造方法的类名::new
        Dog d2 = ifd2.create("老可爱", 3);
        System.out.println(d2);

类方法的方法引用的语法:类名(调用方法存放的类) :: 方法名(要调用的方法名)

/**
 * 设计一个函数式接口
 */
public interface IChangeStringNumber {
    int change(String number);
}

// 创建函数式接口IChangeStringNumber对象
        IChangeStringNumber  icsn = n -> Integer.parseInt(n);
        int num = icsn.change("123");
        System.out.println(num);
        
// 上面代码中lambda是在调用一个类方法,使用类方法引用来简化:类名::方法       
        IChangeStringNumber icsn2 = Integer::parseInt;
        icsn2.change("123");

实例方法的方法引用的语法: 对象 :: 方法名 实例方法Get Set方法可以直接用类名调用,这是特殊情况

/**
 * 设计一个函数式接口
 */
public interface IIsAvi {
    boolean isAvi(String filename);

}

// 创建IIsAvi对象
        IIsAvi avi = fn -> fn.endsWith(".avi"); // 创建函数式接口的对象
        boolean temp = avi.isAvi("蘋蘋在某酒店学习外语.png");
        System.out.println(temp);

        // lambda在调用一个实例方法,用实例方法引用来简化:对象::方法名

        String f = "xxxx.txt";
        IIsAvi avi2 = f::endsWith; // 实例方法的引用
        boolean avi1 = avi2.isAvi(f);
        System.out.println(avi1);

        // 遍历集合
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
//        PrintStream ps = System.out;
//        list.forEach(a -> ps.println(a));
        list.forEach(System.out::println);
小结

方法引用:简化特殊lambda
构造方法引用:类名 :: new
实例的方法的引用:对象名 :: 方法名
类方法的方法引用:类名 :: 方法名

Stream流

概念:Stream是操作数组或者集合的流 (相比IO流,IO流是操作文件流)

注意:Stream只操作数据,不保存数据

  1. 创建Steam流的三种方式:
// 1、创建Stream
        // 1)、通过Arrays 
        int[] arrs = {1,3,5,7,9};
        IntStream sm = Arrays.stream(arrs);// 通过arrs数组创建Stream
        // sm是Stream流对象,sm操作的数据源是arrs

        // 2)、通过集合对象
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 56);
        Stream<Integer> sm2 = list.stream(); // 创建Stream对象
        
        // 3)、Stream里面的of方法
        Stream<Integer> sm3 = Stream.of(1, 2, 3, 4, 5, 6);
  1. 操作流的方法

Stream流的操作步骤:
1)、创建流对象(指定流操作数据源)
2)、操作流:过滤,截取,跳过,去重,排序,切片
3)、结束流:遍历、收集、统计

  • filter(过滤的条件:函数式接口):将不满足条件的数据过滤掉 filter(Predicate<? super T> predicate)`
stream.filter(a -> a % 2 == 0)  // Predicate:断言型的接口  
  • limit(long 数字):截取流里面多个数据,限制流里面显示的条数
stream.limit(2L) // 截取前面2个元素,限制流里面显示的条数
stream.limit(6L) // 截取前面6个元素
  • skip(long n):跳过几条
stream.skip(2L) // 跳过前两条
  • distinct( ) 去重
stream.distinct() // 去除重复数据
  • sorted(Comparator<? super T> comparator):排序 进行排序数据必须实现Comparator
stream.sorted((o1, o2) -> o2 - o1)    // 默认是升序
  • map():切片(给你一种类型,变为另一种类型) map(Function<? super T,? extends R> mapper) 函数型接口
// 将字符串变成int
String str = "12,34,67,5,90,23,4,67,8,9";
String[] split = str.split(",");
Stream<String> stream = Arrays.stream(split); // 创建流
    // 将字符串变成int
long count = stream
 			.map(Integer::parseInt) // Function,将a由String转换int  由.map(a -> integer.parseInt(a))
  • concat(Stream<? extends T> a, Stream<? extends T> b) 将两个流连在一起
Stream.concat(manlist.stream(), womanList.stream())  
  1. 结束流
  • collect():收集

  • collect(Collectors.toList()); // 将结果收集为一个集和

Stream.collect(Collectors.tolist())  // 将收集的内容变成一个集合
  • count():统计个数
Stream.count  // 统计流中的个数
  1. Stream流的分类

    1、串行流:单线程使用(使用最多)

    2、并行流:多线程使用

    // 创建一个串行流
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
      Stream<Integer> stream = list.stream();// 创建的串行流
      stream.forEach(System.out::println);
    
    // 并行流
    Stream<Integer> integerStream = list.parallelStream();   方法parallelStream
    integerStream.forEach(System.out::println);
    

小结stream流

小结Stream流
Stream流的分类
1、串行流:单线程使用(使用最多)
2、并行流:多线程使用

1、创建流
Arrays.stream(数组)
集合对象.stream()
Stream.of(可变参数)

2、流操作的方法:
filter()
limit()
skip()
sorted()
distinct()
map()

3、流结束的方法

forEach()
collect()
count()

单元测试

测试:检查代码有没有bug
黑盒测试:不看代码结构,只看结果
白盒测试:必须要看代码
灰盒测试:能看一部分代码
上面的测试是专业人员弄的

单元测试:测试自己写方法,程序员自己测
使用main方法来做,每一个方法只有一个main,测试很不方便
使用单元测试来代替main

/**
 * 使用单元测试
 *  需要使用一个@Test的注解
 *  第一次使用需要导包
 */
public class TestCase {
    @Test // 单元测试的注解
    // 单元测试的方法,不能有返回值,可以抛出Exception
    public void testDemo1() throws Exception {
        System.out.println("这个单元测试1");
    }
    @Test
    public void testDemo2() throws Exception {

        System.out.println("这个单元测试2");
    }
    @Test
    public void testDemo3() throws Exception {

        System.out.println("这个单元测试3");
    }
    // 在测试方法代码冗余(重复的代码)
    @Before // 在每个测试方法执行之前要执行方法
    public void before() throws Exception {
        System.out.println("hello");
    }

    @After
    public void after() throws  Exception {
        System.out.println("用来释放锁,关闭流");
    }


}

单例模式

概念:一个类就是只有一个对象,那么就是单例,将一个类设计成单例的方式就是单例模式

怎样将一个类设计为单例

1、私有构造方法
2、在当前类创建对象
3、在该类设计一个类方法,返回这个对象

饿汉模式:

/**
 * 将Dog设计为单例:也叫(饿汉模式)
 */
public class Dog {
     // 省略属性
    // 2、创建对象
    private static Dog d = new Dog(); // 不管这个对象用不用,在内存中存在
  
    // 1、私有化构造方法
    private Dog() {}

    // 3、设计一个类方法,返回创建的对象
    public static Dog getInstance() {
        return d;
    }
}

public class SingletonDemo {
    public static void main(String[] args) {
        Dog d1 = Dog.getInstance();
        System.out.println(d1);
        Dog d2 = Dog.getInstance();
        System.out.println(d2);
        Dog d3 = Dog.getInstance();
        System.out.println(d3);
        // 以上指向的都是同一个地址
    }
}

懒汉模式:**

枚举模式:**文章来源地址https://www.toymoban.com/news/detail-773898.html

到了这里,关于1229-方法引用(简化lambda)-stream流-单元测试-单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

    【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

    方法引用是Java编程语言中的一个重要特性,它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambda表达式的代码,使代码更加清晰、简洁。 方法引用是通过名称引用一个现有的方法来代替Lambda表达式的一种方式 。它允许将方法本身作为一个对象传递或存储,并

    2024年02月16日
    浏览(14)
  • Lambda表达式与“::“方法引用 & 判空包装类Optional

    函数式接口(Functional Interface)就是有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为Lambda表达式。 方法引用主要是对Lambda表达式的一种优化! 方法引用的使用前提是对象和方法都是已经存在的! 方法引用提供了一种引用而不执行方

    2024年02月06日
    浏览(32)
  • 记一篇Mockito MyBatisPlus 单元测试时报can not find lambda cache问题

    刚才在写单测时,由于代码中用到了queryWrapper.orderByDesc()方法,报错com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lambda cache for this entity [com.orm.mybatis.entity.Stusent] 用到了queryWrapper.orderByDesc()方法,导致单测报错。 在单测类中写@Before 方法,问题解决

    2024年02月13日
    浏览(11)
  • Optional常用方法实例, 源码挺简单的,重要的是option 与 stream 以及lambda 的连贯使用

    ​empty(): ​of() // 非null 就继续执行 否则抛异常 ​ ofNullable () ​get() //非null就get 否则异常 ​//lambada // 根据是否为NULL进行操作 ​// filter进行以上对下进行输入 如果opt是一集合的话 , 无法进行筛选 , 只能使用集合本身进行filter 取到map orElseThrow() //是空就抛出自定义异常

    2024年02月05日
    浏览(13)
  • Java 8及以上新特性:Lambda表达式、Stream API、Optional类与接口默认方法(四)

    目录 一、接口默认方法 1.1 概念解析: 1.2 应用场景: 1.3 使用注意事项: 1.4 使用示例: 二、结论 1.1 总结Java 8及以上版本四大新特性的重要意义与价值: 1.2 鼓励读者积极学习并运用这些新特性: 1.3 对未来Java版本可能引入的新特性进行展望: 1.1 概念解析: 接口默认方法

    2024年04月13日
    浏览(13)
  • Java Stream简化代码

    使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性能。 最佳实践是避免嵌套流,因为它可能导致代码难以阅读和理解。相反,尝试将问题分解

    2024年01月19日
    浏览(10)
  • Java Lambda Stream

    条件:lambada表达式的主体仅包含一个表达式,且lambada表达式只调用一个已经存在的方法;被引用的方法的参数列表与lambada表达式的输入输出一致 以下是Java 8中方法引用的一些语法: 静态方法引用(static method)语法: classname::methodname 例如: Person::getAge 对象的实例方法引用

    2024年02月02日
    浏览(12)
  • 这10个Lambda表达式必须掌握,简化你的代码,提高生产力

    Lambda 表达式(lambda expression)是一个匿名函数 ,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 Lambda表达式可以表示闭包,和传统数学上的意义有区别。 文末有本文重点总结,关于技术类问题可

    2024年02月05日
    浏览(15)
  • Lambda表达式 & 函数式接口 & Stream流

    Lambda表达式 & 函数式接口 & Stream流

    目录 一. Lambda表达式 1. 函数式编程思想概述 2. Lambda的优化 3. Lambda的格式 标准格式: 参数和返回值: 省略格式: 4. Lambda的前提条件  二. 函数式接口 1. 概述 格式 FunctionalInterface注解 2. 常用函数式接口 Supplier接口 Consumer接口 Function接口 Predicate接口 三. Stream流 1 引言 2. 流式思

    2024年02月08日
    浏览(13)
  • 不可变集合、Lambda表达式、Stream流

    不可变集合、Lambda表达式、Stream流

    不能被修改的集合 应用场景 如果某个数据不能被修改,把它防御性的拷贝到不可变集合中是个很好的实践。 当集合对象被不可信的库调用时,不可变形式是安全的。 创建不可变集合 在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。 方法名称 说明

    2024年02月10日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包