前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java常用工具类2 - 崔笑颜的博客

Java常用工具类2 - 崔笑颜的博客

作者头像
崔笑颜
发布于 2021-02-02 10:00:53
发布于 2021-02-02 10:00:53
48700
代码可运行
举报
运行总次数:0
代码可运行

一、当相同元素为String时 方法一

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * List去重
 */
private List<String> removeDuplicate(List<String> list) {
    LinkedHashSet<String> set = new LinkedHashSet<String>(list.size());
    set.addAll(list);
    list.clear();
    list.addAll(set);
    return list;
}

方法二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<String> list= list.stream().distinct().collect(Collectors.toList());

二、当相同元素为对象时 方法一

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 注意Comparator.comparing要根据参数的类型进行选择
private List<GroupVO> removeDuplicateGroupVO(List<GroupVO> groupVOS){
    return groupVOS.stream().collect(
            Collectors.collectingAndThen(
                    Collectors.toCollection(
                            () -> new TreeSet<>(Comparator.comparing(GroupVO::getId))
                    ), ArrayList::new
            )
    );
}

方法二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 注意Comparator.comparing要根据参数的类型进行选择
private List<GroupVO> removeDuplicateGroupVO(List<GroupVO> groupVOS){
    return groupVOS.stream().collect(
            Collectors.collectingAndThen(
                    Collectors.toCollection(
                            () -> new TreeSet<>(Comparator.comparing(GroupVO::getId))
                    ), ArrayList::new
            )
    );
}

方法三

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
      Map<Object, Boolean> map = new ConcurrentHashMap<>();
      return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
  }
 
// remove duplicate
persons.stream().filter(distinctByKey(p -> p.getId())).forEach(p -> System.out.println(p));

方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制;

方法二:使用输入输出流。(代码注释部分)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package eg2;
 
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Scanner;
 
/******************
 * 文件的复制
 *******************/
 
public class Test2_3 {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入指定文件夹路径:");
        String oldpath = sc.next();
        System.out.println("请输入目标文件夹路径:");
        String newpath = sc.next();
        System.out.println("请输入要复制的文件名:");
        String filename = sc.next();
        copy(filename, oldpath, newpath);
        System.out.println("复制完成!");
    }
 
    private static void copy(String filename, String oldpath, String newpath) throws IOException {
        // TODO Auto-generated method stub
        File oldpaths = new File(oldpath + "/" + filename);
        File newpaths = new File(newpath + "/" + filename);
        if (!newpaths.exists()) {
            Files.copy(oldpaths.toPath(), newpaths.toPath());
        } else {
            newpaths.delete();
            Files.copy(oldpaths.toPath(), newpaths.toPath());
        }
 
        // String newfile = "";
        // newfile += newpaths;
        // FileInputStream in = new FileInputStream(oldpaths);
        // File file = new File(newfile);
        // if (!file.exists()) {
        // file.createNewFile();
        // }
        // FileOutputStream out = new FileOutputStream(newpaths);
        // byte[] buffer = new byte[1024];
        // int c;
        // while ((c = in.read(buffer)) != -1) {
        // for (int i = 0; i < c; i++) {
        // out.write(buffer[i]);
        // }
        // }
        // in.close();
        // out.close();
    }
 
}

java实现文件压缩,文件夹压缩,以及文件和文件夹的混合压缩

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package util;
 
/**
 * @program: transformation
 * @description:
 * @author: cuixy
 * @create: 2019-07-26 14:30
 **/
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
 
/**
 * 压缩算法类
 * 实现文件压缩,文件夹压缩,以及文件和文件夹的混合压缩
 * @author ljheee
 *
 */
public class CompactAlgorithm {
 
    /**
     * 完成的结果文件--输出的压缩文件
     */
    File targetFile;
 
    public CompactAlgorithm() {}
 
    public CompactAlgorithm(File target) {
        targetFile = target;
        if (targetFile.exists())
            targetFile.delete();
    }
 
    /**
     * 压缩文件
     *
     * @param srcfile
     */
    public void zipFiles(File srcfile) {
 
        ZipOutputStream out = null;
        try {
            out = new ZipOutputStream(new FileOutputStream(targetFile));
 
            if(srcfile.isFile()){
                zipFile(srcfile, out, "");
            } else{
                File[] list = srcfile.listFiles();
                for (int i = 0; i < list.length; i++) {
                    compress(list[i], out, "");
                }
            }
 
            System.out.println("压缩完毕");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 压缩文件夹里的文件
     * 起初不知道是文件还是文件夹--- 统一调用该方法
     * @param file
     * @param out
     * @param basedir
     */
    private void compress(File file, ZipOutputStream out, String basedir) {
        /* 判断是目录还是文件 */
        if (file.isDirectory()) {
            this.zipDirectory(file, out, basedir);
        } else {
            this.zipFile(file, out, basedir);
        }
    }
 
    /**
     * 压缩单个文件
     *
     * @param srcfile
     */
    public void zipFile(File srcfile, ZipOutputStream out, String basedir) {
        if (!srcfile.exists())
            return;
 
        byte[] buf = new byte[1024];
        FileInputStream in = null;
 
        try {
            int len;
            in = new FileInputStream(srcfile);
            out.putNextEntry(new ZipEntry(basedir + srcfile.getName()));
 
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.closeEntry();
                if (in != null)
                    in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 压缩文件夹
     * @param dir
     * @param out
     * @param basedir
     */
    public void zipDirectory(File dir, ZipOutputStream out, String basedir) {
        if (!dir.exists())
            return;
 
        File[] files = dir.listFiles();
        for (int i = 0; i < files.length; i++) {
            /* 递归 */
            compress(files[i], out, basedir + dir.getName() + "/");
        }
    }
 
 
 
}
 

运行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//压缩测试
File f = new File("/Users/cuixiaoyan/Downloads/浏览器下载");
new CompactAlgorithm(new File( "/Users/cuixiaoyan/Downloads/",f.getName()+".zip")).zipFiles(f);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年1月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
你所不知道的Spring的@Autowired实现细节
相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知道了。友情提示:本篇主要是讲解Autowired的实现原理,不会分析Spring初始化的过程,不熟悉的读者可以先阅读笔者之前的一篇文章《这一次搞懂Spring的Bean实例化原理》。
夜勿语
2020/09/07
6100
@Autowired 到底是怎么把变量注入进来的?
在 Spring 容器中,当我们想给某一个属性注入值的时候,有多种不同的方式,例如可以通过构造器注入、可以通过 set 方法注入,也可以使用 @Autowired、@Inject、@Resource 等注解注入。
江南一点雨
2023/09/09
4670
@Autowired 到底是怎么把变量注入进来的?
谈谈 @Autowired 的实现原理
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/13
4320
谈谈 @Autowired 的实现原理
@Autowired 与 @Resource 有何不同
@Autowired来自于 spring-beans 模块;而@Resource则来自于 jakarta.annotation-api 模块,它是 Jakarta EE 规范中的内容。虽然 @Autowired 与 @Resource 均用于实现依赖注入,但 Spring 对二者的处理逻辑是不一样的。
程序猿杜小头
2023/03/05
7060
@Autowired 与 @Resource 有何不同
Spring注解@Resource源码分析
继续追踪,看metadata.inject(bean, beanName, pvs)方法
周同学
2019/10/14
1.7K0
spring源码篇(四)依赖注入(控制反转)
​ 上一篇走了一遍bean的生成过程,也是spring容器启动的一个重要过程,而在这个过程中,有一个属性填充的步骤,也就是依赖注入,这个概念不难,但其底层实现其实却有很多复杂的步骤,使得这个依赖注入的功能比较强大,所以这篇就是从源码角度,了解spring的依赖注入功能。
用针戳左手中指指头
2021/03/22
7420
@Autowired注解实现原理
在讨论代码细节之前,我们再来了解下基础知识。Spring管理可用于整个应用程序的Java对象bean。他们所在的Spring容器,被称为应用程序上下文。这意味着我们不需要处理他们的生命周期(初始化,销毁)。该任务由此容器来完成。另外,该上下文具有入口点,在Web应用程序中,是dispatcher servlet。容器(也就是该上下文)会在它那里被启动并且所有的bean都会被注入。 说的再清楚点,请看<context:annotation-config />的定义: <xsd:element name="an
JavaEdge
2018/05/16
1.8K0
Spring中的MergedBeanDefinitionPostProcessor有什么作用 ?
MergedBeanDefinitionPostProcessor这个Bean后置处理器大家可能关注的比较少,其本身也只提供了一个bean生命周期回调接口:
大忽悠爱学习
2023/05/23
1K0
Spring中的MergedBeanDefinitionPostProcessor有什么作用 ?
从源码层面带你实现一个自动注入注解
如何自己实现一个自动注入的注解 ---- 首先,需要了解到的是。Spring Bean 的生命周期 在生命周期中。注入bean属性的位置是在以下代码:populateBean 位置中 那么我们在项目中使用注解 产生一个bean的时候必定会经过以下代码进行一个bean的创建流程 /**省略代码**/ // 开始初始化 bean 实例对象 Object exposedObject = bean; try { // <5> 对 bean 进行填充,将各个属性值注入,其中,可能存在依赖于其他 bean 的属
云扬四海
2021/09/22
4210
源码剖析Spring依赖注入:今天你还不会,你就输了
在之前的讲解中,我乐意将源码拿出来并粘贴在文章中,让大家看一下。然而,我最近意识到这样做不仅会占用很多篇幅,而且实际作用很小,因为大部分人不会花太多时间去阅读源码。
努力的小雨
2024/02/06
3180
看完让你吊打面试官-@Autowired注解到底怎么实现的?
用来执行依赖注入.每当一个Spring管理的bean发现有该注解时,会直接注入相应的另一个Spring管理的bean.
JavaEdge
2020/05/27
1.4K0
看完让你吊打面试官-@Autowired注解到底怎么实现的?
Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor
冬天vs不冷
2025/01/21
2610
Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor
Spring源码:Bean生命周期(五)
在上一篇文章中,我们深入探讨了 Spring 框架中 Bean 的实例化过程,该过程包括从 Bean 定义中加载当前类、寻找所有实现了 InstantiationAwareBeanPostProcessor 接口的类并调用实例化前的方法、进行实例化、调用 applyMergedBeanDefinitionPostProcessors 方法等多个步骤,最终生成了一个真正的 Bean 实例。但是,这个 Bean 实例还没有被初始化和注入属性,还不能真正发挥作用。
努力的小雨
2024/05/07
1340
Spring源码解析(八):bean后置处理器CommonAnnotationBeanPostProcessor
冬天vs不冷
2025/01/21
2190
Spring源码解析(八):bean后置处理器CommonAnnotationBeanPostProcessor
一个特殊的 BeanPostProcessor
关于 BeanPostProcessor 松哥之前已经写过好几篇文章和大家聊过了,不过之前聊的都是常规的 BeanPostProcessor 玩法,还有一个特殊的 BeanPostProcessor,今天松哥来和大家梳理一下。
江南一点雨
2024/01/17
1920
一个特殊的 BeanPostProcessor
这篇文章,我们来谈一谈Spring中的属性注入
在前面的文章中已经知道了Spring是如何将一个对象创建出来的,那么紧接着,Spring就需要将这个对象变成一个真正的Bean了,这个过程主要分为两步
程序员DMZ
2020/07/14
1.8K0
@Autowired注解到底怎么实现的,你能说清楚么?
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。
Java小咖秀
2021/07/12
6780
不一样的视角来学习Spring源码之容器与Bean---上
Spring 的发展历史较为悠久,因此很多资料还在讲解它较旧的实现,这里出于怀旧的原因,把它们都列出来,供大家参考
大忽悠爱学习
2022/05/10
4800
不一样的视角来学习Spring源码之容器与Bean---上
注解@Autowired是如何实现的
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。spring技术自身也在不断的发展和改变,从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@Autowired注解了。这个注解的功能就是为我们注入一个定义好的bean。那么,这个注解除了我们常用的属性注入方式之外还有哪些使用方式呢?它在代码层面又是怎么实现的呢?这是本篇文章着重想讨论的问题。
chengcheng222e
2021/11/04
7360
@Autowired通过源码进行原理详解
IOC,inversion of control 控制反转,有时候也叫DI,dependency injection 依赖注入,是一种代码解耦的方式。
田维常
2019/07/16
2.5K0
推荐阅读
相关推荐
你所不知道的Spring的@Autowired实现细节
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档