java成神之——properties,lambda表达式,序列化

  • Properties

    • 加载defaults.properties文件
    • 写Properties到xml文件
    • 读Properties从xml文件
  • Lambda表达式
    • 自定义
    • 内置
    • sort方法中使用Lambada
  • 序列化
    • 文件序列化
    • Gson序列化
    • Jackson序列化
  • Comparable和Comparator
    • Comparable对象排序
    • Comparator对象排序
  • 结语

Properties

加载defaults.properties文件

defaults.properties内容如下

    lastname=Smith

获取properties属性(defaults.properties文件和TestController文件置于同级目录)

    try (InputStream bundledResource = TestController.class.getResourceAsStream("defaults.properties")) {
        Properties defaults = new Properties();
        defaults.load(bundledResource);
        return defaults;
    } catch (IOException e) {
        throw new UncheckedIOException( "defaults.properties not properly packaged" + " with application", e);
    }

写Properties到xml文件

Properties prop = new Properties();
prop.setProperty("name", "Steve");
prop.setProperty("color", "green");
prop.setProperty("age", "23");
File file = new File("C:\\Users\\26401\\Desktop\\defaults.properties");
if (!file.exists()){
    file.createNewFile();
}
prop.storeToXML(new FileOutputStream(file), "testing properties with xml");

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>testing properties with xml</comment>
<entry key="color">green</entry>
<entry key="name">Steve</entry>
<entry key="age">23</entry>
</properties>

读Properties从xml文件

Properties prop = new Properties();
File file = new File("C:\\Users\\26401\\Desktop\\defaults.properties");
if (file.exists()){
    prop.loadFromXML(new FileInputStream(file));
    for (String name : prop.stringPropertyNames()){
        System.out.println(name + "=" + prop.getProperty(name));
    }
}else {
    System.err.println("Error: No file found at: " + file);
}

Lambda表达式

自定义

Lambda表达式只能用于函数式接口

函数式接口只能包含一个抽象方法,可以有多个default和static方法,可以有多个重写对象的方法

@FunctionalInterface
interface MyFunctionalInterface {
    void fn();
}

MyFunctionalInterface mfi = () -> System.out.println("函数式接口");
mfi.fn();

等价于

MyFunctionalInterface mfi = new MyFunctionalInterface() {
    @Override
    public void fn() {
        System.out.println("函数式接口");
    }
};

内置

Predicate<String> p = o -> o.isEmpty();            // 返回值类型必须是布尔值
Function<String, Boolean> f = o -> o.isEmpty();    // 返回值类型可以自定义
Consumer<String> c = o -> System.out.println(o);   // 返回值类型为void
c.accept("没有返回值");

sort方法中使用Lambada

原始写法
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
Collections.sort(list, new Comparator<Integer>(){
    public int compare(Integer b, Integer l){
        return b.compareTo(l);
    }
}); // [1,2,3]

Lambada写法
Collections.sort(list, (b, l) -> b.compareTo(l));

或者
Collections.sort(list, Comparator.comparing(Integer::valueOf));

序列化

文件序列化

public class SerialClass implements Serializable {
    private static final long serialVersionUID = 1L;
}

Gson序列化

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

public class User {

    private Integer id;
    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    getter...
    setter...
}

// 序列化成json
User user = new User(1, "小李");
Gson gson = new Gson();
String json = gson.toJson(user);
// 反序列化
User userCopy = gson.fromJson(json, User.class);

Jackson序列化

依赖

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.6</version>
    </dependency>

json字符串转对象

    ObjectMapper objectMapper = new ObjectMapper();
    User outputObject = objectMapper.readValue( "{\"id\":\"1\",\"name\":\"小叶\"}", User.class);
    outputObject.getName();

    @JsonIgnoreProperties(ignoreUnknown = true) // 忽视反序列化遇到的不认识的属性
    public class User {
        ...
    }

对象转字符串

    User user = new User(1, "小李");
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);

Comparable和Comparator

Comparable对象排序

public class User implements Comparable<User> {

    private Integer id;
    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (! (o instanceof User)) return false;
        User p = (User)o;
        return id.equals(p.id) && name.equals(p.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
    @Override
    public int compareTo(User other) {
        int idCompare = id.compareTo(other.id);
        if (idCompare != 0) {
            return idCompare;
        } else {
            return id.compareTo(other.id);
        }
    }
}

List<User> list = Arrays.asList(new User(2, "小李"), new User(3, "小李"), new User(1, "小李"));
Collections.sort(list);

Comparator对象排序

List<User> list = Arrays.asList(new User(2, "小李"), new User(3, "小张"), new User(1, "小王"));

Collections.sort(list, new Comparator<User>() {
    @Override
    public int compare(User u1, User u2) {
        return u1.getId().compareTo(u2.getId());
    }
});

Collections.sort(list,(u1, u2) -> {
    return u1.getId().compareTo(u2.getId());
});

Collections.sort(list,Comparator.comparing(User::getId).thenComparing(User::getName));

结语

本文章是java成神的系列文章之一

如果你想知道,但是本文没有的,请下方留言

我会第一时间总结出来并发布填充到本文

原文地址:https://www.cnblogs.com/ye-hcj/p/9745975.html

时间: 2024-11-07 14:31:07

java成神之——properties,lambda表达式,序列化的相关文章

java成神之——文件IO

文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStream和FileInputStream复制文件 FileWriter FileReader BufferedWriter BufferedReader 基本用法 StringWriter InputStreams转换成字符串 BufferedInputStream ObjectOutputStream

2016,Java成神初年

时间2016.12.31 01:51 地点K9004 5号车厢 1号下铺 此刻 深夜 不眠 回想 反思 规划! 工作快四年了,每年经历不同,心思不同!2013,从学生到职场人的转变,在长沙工作半年,第一感觉轻松和新鲜!但我觉得长沙不适合我,我要离开,所以告诉自己我要去深圳!2014,年初八杀入深圳,开始自己的苦逼人生,来到创业公司,各种加班,各种出差.2014最大收获是交了媳妇.2015,坑爹一年,心浮躁了,没有好好学习,工作很忙,各种加班,进步很小,年底感觉不能在呆了.2016,年初9立马辞职

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,

java成神之——java中string的用法

java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取指定位置字符和replace的使用 StringBuffer的使用 字符串转换 基本类型的转换 添加字符编码 Base64的编码和解码 结语 java中String的用法 String基本用法 字符串一旦创建在堆中就不可变 字符串声明 String str = "你好"; String s

java成神之——注释修饰符

注释修饰符 自定义注释 元注释 通过反射在runtime访问注释 内置注释 多注释实例 错误写法 使用容器改写 使用@Repeatable元注释 注释继承 使用反射获取注释 获取类的注释 获取方法的注释 结语 注释修饰符 自定义注释 元注释 用来注释自定义注释的注释 @Target 限定注释允许加载的目标 @Target(ElementType.METHOD) 只能用于方法 @Target({ElementType.FIELD, ElementType.TYPE}) 可以用于字段和类型 ANNO

java成神之——enum枚举操作

枚举 声明 枚举遍历 枚举在switch中使用 枚举比较 枚举静态构造方法 使用类来模拟枚举 枚举中定义抽象方法 枚举实现接口 单例模式 使用静态代码快 EnumSet EnumMap 结语 枚举 声明 基本使用 public enum ChineseNumber { YI, ER, SAN, SI } ChineseNumber.values(); // ["YI","ER","SAN","SI"] 枚举遍历 for (Ch

java成神之——Stream和Optional

Stream流 基本使用 流关闭 平行流 流重用 iterator转换成流 分组计数 无限流 流转集合 压缩流 统计数值流 集合转换流遍历 流拼接 reduce 使用流生成随机字符串 流的包装流 几种包装流 包装流写字符到文件 加密和压缩数据 Optional Optional的常用方法 Optional的基本使用 原始数据类型 结语 Stream流 基本使用 Stream<String> myStream = Stream.of("a", "", &q

java成神之——正则表达式基本使用

正则表达式 常用匹配规则 基本使用 标记符的使用 部分正则标记 正则表达式在字符串方法中的使用 结语 正则表达式 常用匹配规则 [abc] abc其中一个 [^abc] abc之外的一个 [a-z] a和z之间的一个 . 表示任意字符 \d 表示一个数字 \D 非数字 \w 表示a-zA-Z0-9_ \W 非a-zA-Z0-9_ ^ 开头 $ 结尾 \b 英文单词边界 ? 一次或者0次 * 零次或者多次 + 一次或者多次 {n} 出现制定n次 {n,} 至少n次 {n,m} >=n <=m 次

java成神之——HttpURLConnection访问api

HttpURLConnection 访问get资源 访问post资源 访问Delete资源 获取状态码 结语 HttpURLConnection 访问get资源 HttpURLConnection connection = (HttpURLConnection)new URL("http://ip/test").openConnection(); int responseCode = connection.getResponseCode(); InputStream inputStre