端杂七杂八系列篇四-Java8篇

news2024/11/13 11:22:37

后端杂七杂八系列篇四-Java8篇

  • ① Lombok插件
    • ① @RequiredArgsConstructor
    • ② @SneakyThrows
    • ③ @UtilityClass
    • ④ @Cleanup
  • ② Lambda 4个常用的内置函数
    • ① Function<T, R> - 接受一个输入参数并返回一个结果
    • ② Consumer - 接受一个输入参数,并执行某种操作(无返回值)
    • ③ Supplier - 不接受任何参数,但产生一个结果
    • ④ Predicate - 接受一个输入参数并返回一个布尔值
  • ③ Optional
  • ④ 常用Stream流
    • stream 中间操作
    • stream 终端操作
  • Java 8中的Future和CompletableFuture
    • Future
    • CompletableFuture

① Lombok插件

Lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具。

① @RequiredArgsConstructor

在这里插入图片描述

② @SneakyThrows

在 Java 中,异常被分为了受查异常 (checked exception)和 非受查异常(unchecked exception)两种。
非受查异常又叫运行时异常,即 RuntimeException。
受查异常,即 Exception。

受查异常是Java给你检查的异常,需要你手动try catch

比如这个,写的时候会报错,IDE会提示我们需要加上try catch

在这里插入图片描述

运行时异常是Java 运行时候报出来的异常,一般是我们程序员写错了。


我们的@SneakyThrows就是为了让我们少写try catch 代码, 即在有受查异常的时候,我们加上注解,就不用写try catch了。


代码举例

import lombok.SneakyThrows;

public class SneakyThrowsDemo {

	// 使用注解
    @SneakyThrows
    public String readFile(String filePath) {
        File file = new File(filePath);
        BufferedReader reader = new BufferedReader(new FileReader(file));
        StringBuilder content = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            content.append(line).append("\n");
        }
        reader.close();
        return content.toString();
    }


	// 不使用注解
	public String readFileWithout(String filePath) {
	    try{
	    	File file = new File(filePath);
        	BufferedReader reader = new BufferedReader(new FileReader(file));
        	StringBuilder content = new StringBuilder();
        	String line;
        	while ((line = reader.readLine()) != null) {
            	content.append(line).append("\n");
        	}
        	reader.close();
        	return content.toString();
	    }catch(e){
	    
	    }

    }
    public static void main(String[] args) {
        SneakyThrowsDemo demo = new SneakyThrowsDemo();
        // 无需捕获FileNotFoundException和IOException
        System.out.println(demo.readFile("example.txt"));
    }
}

③ @UtilityClass

用于定义工具类的时候,不用定义static的方法了。

在这里插入图片描述

举个例子

public class UtilClass {
    // 静态变量,全局存储
    public static int globalCount = 0;

    // 静态方法,可以直接通过类名调用,无需创建对象
    public static void incrementCount() {
        globalCount++;
    }

    // 其他静态工具方法
    public static String formatString(String input) {
        return "Formatted: " + input.toUpperCase();
    }

    // 使用示例:
    public static void main(String[] args) {
        // 不需要创建UtilClass对象,直接访问静态成员
        UtilClass.incrementCount();
        System.out.println(UtilClass.globalCount); // 输出:1

        String formattedString = UtilClass.formatString("hello world");
        System.out.println(formattedString); // 输出:Formatted: HELLO WORLD
    }
}

在Java中,静态工具类中的属性默认情况下是可以一直保留的,除非显式地进行修改或者JVM垃圾回收机制清除了该类的Class对象(这在正常应用中非常罕见)。

在这里插入图片描述
在这里插入图片描述


使用注解时候的demo

@UtilityClass
public class WxMpContextHolder {

	private final ThreadLocal<String> THREAD_LOCAL_APPID = new TransmittableThreadLocal<>();

	/**
	 * TTL 设置appId
	 * @param appId
	 */
	public void setAppId(String appId) {
		THREAD_LOCAL_APPID.set(appId);
	}

	/**
	 * 获取TTL中的appId
	 * @return
	 */
	public String getAppId() {
		return THREAD_LOCAL_APPID.get();
	}

	public void clear() {
		THREAD_LOCAL_APPID.remove();
	}

}

④ @Cleanup

>

// Java 标准的写法

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}




// 注解的写法
public class CleanupExample {
  public static void main(String[] args) throws IOException {
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) {
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
    }
  }
}

② Lambda 4个常用的内置函数

① Function<T, R> - 接受一个输入参数并返回一个结果

public class FunctionDemo {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // 使用lambda表达式转换字符串为大写
        Function<String, String> toUpperCase = s -> s.toUpperCase();

        names.stream()
             .map(toUpperCase)
             .forEach(System.out::println);
    }
}

② Consumer - 接受一个输入参数,并执行某种操作(无返回值)

public class ConsumerDemo {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用lambda表达式打印数字
        Consumer<Integer> printNumber = n -> System.out.println("Number: " + n);

        numbers.forEach(printNumber);
    }
}

③ Supplier - 不接受任何参数,但产生一个结果

public class SupplierDemo {
    public static void main(String[] args) {
        // 使用lambda表达式生成随机数
        Supplier<Integer> randomIntSupplier = () -> (int) (Math.random() * 100);

        System.out.println("Random number: " + randomIntSupplier.get());
    }
}

④ Predicate - 接受一个输入参数并返回一个布尔值

public class PredicateDemo {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Durian");

        // 使用lambda表达式检查字符串长度是否大于5个字符
        Predicate<String> isLongFruit = fruit -> fruit.length() > 5;

        fruits.stream()
              .filter(isLongFruit)
              .forEach(System.out::println);
    }
}

③ Optional

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

用法例子一

public class Student {
    private String name;
    private int age;
    private Integer score;
    
    //省略 construct get set
}
 
public List<Student> initData(){
    Student s1 = new Student("张三", 19, 80);
    Student s2 = new Student("李四", 19, 50);
    Student s3 = new Student("王五", 23, null);
    Student s4 = new Student("赵六", 16, 90);
    Student s5 = new Student("钱七", 18, 99);
    Student s6 = new Student("孙八", 20, 40);
    Student s7 = new Student("吴九", 21, 88);
 
    return Arrays.asList(s1, s2, s3, s4, s5, s6, s7);
}



@Test
public void beforeJava8() {
    List<Student> studentList = initData();
 
    for (Student student : studentList) {
        if (student != null) {
            if (student.getAge() >= 18) {
                Integer score = student.getScore();
                if (score != null && score > 80) {
                    System.out.println("入选:" + student.getName());
                }
            }
        }
    }
}


@Test
public void useJava8() {
    List<Student> studentList = initData();
    for (Student student : studentList) {
        Optional<Student> studentOptional = Optional.of(student);
        Integer score = studentOptional.filter(s -> s.getAge() >= 18).map(Student::getScore).orElse(0);
 
        if (score > 80) {
            System.out.println("入选:" + student.getName());
        }
    }
}

用法例子二

public String test0(AlarmAllParmeter alarmAllParmeter) {
        String errorResult = "";
        if (null != alarmAllParmeter) {
            Integer alarmId = alarmAllParmeter.getAlarmEventInputId();
            if (null != alarmId) {
                AlarmEventInput alarmEventInput = alarmEventInputService.get(alarmId);
                if (null != alarmEventInput) {
                    String alarmName = alarmEventInput.getAlarmName();
                    int alarmType = alarmEventInput.getAlarmType();
                    return String.valueOf(alarmType) + "-" + alarmName;
                } else {
                    return errorResult;
                }
            } else {
                return errorResult;
            }
        } else {
            return errorResult;
        }
    }





// 改进方案一
    public String test1(AlarmAllParmeter alarmAllParmeter){
        String errorResult = "";
        Optional<AlarmAllParmeter> op = Optional.ofNullable(alarmAllParmeter);
        if(op.isPresent()){
            Integer alarmId = op.get().getAlarmEventInputId();
            Optional<Integer> op1 = Optional.ofNullable(alarmId);
            if(op1.isPresent()){
                AlarmEventInput alarmEventInput = alarmEventInputService.get(op1.get());
                Optional<AlarmEventInput> op2 = Optional.ofNullable(alarmEventInput);
                if (op2.isPresent()) {
                    String alarmName = alarmEventInput.getAlarmName();
                    int alarmType = alarmEventInput.getAlarmType();
                    return String.valueOf(alarmType) + "-" + alarmName;
                } else {
                    return errorResult;
                }
            }
            else {
                return errorResult;
            }
        }
        else {
            return errorResult;
        }
    }



// 改进方案二
public String test2(AlarmAllParmeter alarmAllParmeter){
        return Optional.ofNullable(alarmAllParmeter)
                       .map(a -> a.getAlarmEventInputId())
                       .map(a -> alarmEventInputService.get(a))
                       .map(a -> String.valueOf(a.getAlarmType())+"-"+a.getAlarmName())
                       .orElse("");
    }

④ 常用Stream流

在这里插入图片描述

在这里插入图片描述

stream 中间操作


在这里插入图片描述

// filter
List<Person> result = list.stream()
                    .filter(Person::isStudent)
                    .collect(toList());

// distinct
List<Person> result = list.stream()
                    .distinct()
                    .collect(toList());
                    
// limit
List<Person> result = list.stream()
                    .limit(3)
                    .collect(toList());


// skip
List<Person> result = list.stream()
                    .skip(3)
                    .collect(toList());



// map
List<String> result = list.stream()
                    .map(Person::getName)
                    .collect(toList());

stream 终端操作


在这里插入图片描述

// anyMatch
boolean result = list.stream()
            .anyMatch(Person::isStudent);


// allMatch
boolean result = list.stream()
            .allMatch(Person::isStudent);


// noneMatch
boolean result = list.stream()
            .noneMatch(Person::isStudent);


// findAny
Optional<Person> person = list.stream().findAny();


// findFirst
Optional<Person> person = list.stream().findFirst();

Java 8中的Future和CompletableFuture

在这里插入图片描述
在这里插入图片描述

Future


用法demo

public class FutureExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建一个线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();

        // 提交一个Callable任务到线程池,返回一个Future对象
        Future<String> future = executor.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000); // 模拟耗时操作
                return "Hello from Future!";
            }
        });

        // 主线程可以继续执行其他任务,不被阻塞
        System.out.println("Main thread is doing other tasks...");

        // 当需要获取结果时,调用Future的get方法,该方法会阻塞直到结果准备好
        String result = future.get();
        System.out.println(result);

        // 关闭线程池
        executor.shutdown();
    }
}

CompletableFuture


用法demo

public class CompletableFutureExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建一个CompletableFuture对象并提供一个异步计算的任务
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000); // 模拟耗时操作
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Hello from CompletableFuture!";
        });

        // 使用thenApply方法进行链式处理,将上一步的结果转换为新的结果
        CompletableFuture<Integer> lengthFuture = future.thenApply(result -> result.length());

        // 使用thenAccept方法处理完成后的结果,不返回任何值
        lengthFuture.thenAccept(length -> System.out.println("Length: " + length));

        // 等待所有任务完成
        CompletableFuture.allOf(future, lengthFuture).join();

        // 或者直接获取结果(这会阻塞直到结果准备好)
        // int length = lengthFuture.get();
        // System.out.println("Length: " + length);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jumpserver中安装httpx

查看已安装的包 pip freeze # python -V # Python 2.7.5安装anyio 刚开始直接pip install httpx&#xff0c;未设置版本号&#xff0c;因已有idna2.7&#xff0c;所以出现版本不兼容的现象 anyio 3.0.0 requires idna>2.8, but you have idna 2.7 which is incompatible.…

Red Hat Enterprise Linux 8.9 安装图解

引导和开始安装 选择倒计时结束前&#xff0c;通过键盘上下键选择下图框选项&#xff0c;启动图形化安装过程。需要注意的不同主板默认或者自行配置的固件类型不一致&#xff0c;引导界面有所不同。也就是说使用UEFI和BIOS的安装引导界面是不同的&#xff0c;如图所示。若手动调…

【VRTK】【Unity】【游戏开发】项目实践-小游戏

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【背景】 本篇做一个综合实践,应用所学做一个mini VR游戏。不用写一行代码,纯粹理解并使用现有的VRTK脚本。 【导入所需资源】 在之前VRTK项目基础上…

Pix2Pix理论与实战

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、引入 在之前的学习中&#xff0c;我们知道…

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统

实验五 实验名称 温室盆栽灌溉系统 软件设计&#xff1a; 1. 定义对应的引脚和端口的别名。 2. 编写延时函数&#xff0c;用于控制程序的执行速度。 3. 编写LCD控制函数&#xff0c;包括发送命令和发送数据两种操作。 4. 编写显示函数&#xff0c;用于在LCD上显示字符串…

docker硬件交互 _ROS2

docker硬件交互 _ROS2 将自己需要挂载的设备接到主板上&#xff0c;在宿主机中建立udev规则&#xff08;/etc/udev/rules.d/&#xff09;然后在开启容器时&#xff0c;将设置了规则的devices 通过 --device/dev/myserial --device/dev/rplidar 等 参数挂载到docker容器中 doc…

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站&#xff0c;默认的文章和页面编辑器&#xff0c;以及小工具都是使用古腾堡编辑器&#xff08;Gutenberg块编辑器&#xff09;。虽然有很多站长说这个编辑器很好用&#xff0c;但是仍然有很多站长用不习惯&#xff0c;觉得操作太难了&#xf…

【Linux取经路】初探进程地址空间

文章目录 一、历史问题回顾二、语言层面的地址空间2.1 验证 三、虚拟地址的引入3.1 初步解释这种现象——引入地址空间的概念3.2 再来粗粒度理解上面的现象 四、细节解释4.1 地址空间究竟是什么&#xff1f;4.2为什么要有地址空间4.3 页表4.3.1 CR3寄存器4.3.2 页表是由页表项组…

【Qml-数据模型和视图】

Qml编程指南 VX&#xff1a;hao541022348 ■ 数据模型和视图■ ■ 数据模型和视图 QML使用了与Qt中Model-View类似的结构模型类提供了数据模型可以使QML的简单数据&#xff0c;或者复杂的C数据 QML: ListModel, XmlListModel, VisualItemModelC: QAbstractItemModel, QStringL…

NX二次开发获取圆弧的四个象限点

我是用来用来画水路线框的UF_MODL_ask_curve_points&#xff08;&#xff09;可以按弧长或者弧度获取曲线的等分点&#xff0c;取PI/2的圆弧&#xff0c;即将圆弧四等分&#xff0c;你也可以取任意等分点。 int GetArcPoint(tag_t arc_tag,double point[4][3]) {if(arc_tag0)r…

Docker 47 个常见故障的原因和解决方法

【作者】曹如熙&#xff0c;具有超过十年的互联网运维及五年以上团队管理经验&#xff0c;多年容器云的运维&#xff0c;尤其在Docker和kubernetes领域非常精通。 Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&#xff1a; 1、通过docker r…

《Linux高性能服务器编程》笔记02

Linux高性能服务器编程 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第06章 高级I/O函数6.1 pipe函数6.2 dup函数和dup2函数6.3 readv 函数和writev 函数6.4 sendfile 函数6.…

Redmine替代品合集:6款值得尝试的项目管理软件

在软件开发和项目管理行业&#xff0c;Redmine曾经是一个大家公认的、基于Web的项目管理工具。随着技术的发展和团队需求的多样化&#xff0c;市场上出现了许多功能强大的Redmine替代品。这些工具在特定方面—无论是用户界面、功能集、集成能力还是用户体验上—都可能提供更新颖…

Architecture Lab:预备知识2【汇编call/leave/ret指令、CS:APP练习4.4】

chap4的练习4.4&#xff08;page.255&#xff09;让用Y86-64实现rsum&#xff08;递归求数组元素之和&#xff09;&#xff0c;提示为&#xff1a;先得到x86-64汇编代码&#xff0c;然后转换成Y86-64的 这是rsum的c实现&#xff1a; long rsum(long *start, long count) {if …

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

知识点 高精度运算

1.基础知识&#xff1a; int是一个机器字长&#xff0c;在32位机器上是32位&#xff0c;则表示范围是[-,-1]&#xff0c;可表示的最大整数不会超过。 long long是两个机器字长&#xff0c;表示范围是[-,-1]&#xff0c;可表示的最大整数不会超过。 2.适用于需要表示的数据过大…

C++实战:实现生命游戏

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;编写生命头文件&#xff08;二&#xff09;创建生命实现文件&#xff08;三&#xff09;编写工具头文件&#xff08;四&#xff09;编写工具实现文件&#xff08;五&#xff09;编写主程序文件&#xff08;六&…

wordcloud,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - wordcloud。 Github地址&#xff1a;https://github.com/amueller/word_cloud 词云图是一种独特而引人注目的数据可视化方式&#xff0c;通常用于显示…

第35集《佛法修学概要》

己四 、 精进度 分三&#xff1a;庚一、 精进自性。庚 二、趣入修习精进方便。 庚三、修习精进差别内容 请大家打开讲义第九十四页&#xff0c;我们看己四&#xff0c;精进度。 当我们从人天乘一个好人的阶段提升到一种菩萨道的修学&#xff0c;我们就要注意两个重点了。在我…

什么是内网穿透?

简介&#xff1a; 书面来说&#xff1a;内网穿透是一种网络技术&#xff0c;用于将内部私有网络中的服务暴露给公共网络&#xff0c;使得外部网络可以通过公网访问内网的服务。通常情况下&#xff0c;内网中的设备和服务由于位于私有网络中&#xff0c;无法直接通过公网IP进行…