Java集合
判断所有集合内部的元素是否为空,使用isEmpty(),而不是size() == 0
原因:isEmpty()的可读性好,并且时间复杂度是O(1)
不要在foreach循环里进行元素的remove/add
操作,remove元素使用Iterator
方式,如果是并发操作,需要对Iterator
对象加锁.
多个线程对一个集合的内容操作,就会产生 fail-fast
(错误检测)机制,一旦检测到可能发生错误,就立马抛出异常,程序不继续往下执行.
解决方案:
使用Stream流中的filter过略
List<String> userNames = new ArrayList<String>() {{
add("Hollis");
add("hollis");
add("HollisChuang");
add("H");
}};
userNames = userNames.stream().filter(userName -> !userName.equals("Hollis")).collect(Collectors.toList());
System.out.println(userNames);
集合去重复 —> set
集合转数组 —> toArray(T[] array)
Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换(依赖boxed的装箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());
集合迭代
void lamndaFor() {
List<String> strings = Arrays.asList("1", "2", "3");
//传统foreach
for (String s : strings) {
System.out.println(s);
}
//Lambda foreach
strings.forEach((s) -> System.out.println(s));
//or
strings.forEach(System.out::println);
//map
Map<Integer, String> map = new HashMap<>();
map.forEach((k,v)->System.out.println(v));
}
Optional
类
解决 NPE
问题
Zoo zoo = getZoo();
if(zoo != null){
Dog dog = zoo.getDog();
if(dog != null){
int age = dog.getAge();
System.out.println(age);
}
}
// 层层判空
Optional.ofNullable(zoo).map(o -> o.getDog()).map(d -> d.getAge()).ifPresent(age ->
System.out.println(age)
);
ofNullable
方法和of
方法唯一区别就是当 value 为 null 时,ofNullable
返回的是EMPTY
,of 会抛出NullPointerException
异常。如果需要把NullPointerException
暴漏出来就用of
,否则就用ofNullable
。
// 高频方法
Optional.ofNullable(zoo) // 创建一个可能为空的 Optional 对象,如果 zoo 为 null,则创建一个空的 Optional。
.map(o -> o.getDog()) // 如果 zoo 存在,调用其 getDog() 方法获取 Dog 对象,否则跳过此步骤。
.map(d -> d.getAge()) // 如果 Dog 对象存在,调用其 getAge() 方法获取 Dog 的年龄,否则跳过此步骤。
.filter(v -> v == 1) // 如果年龄存在并且等于 1,则通过 filter 保留这个值,否则将其过滤掉。
.orElse(3); // 如果之前的操作链中有任何一步为空或者不满足条件,最终返回默认值 3。
Date-Time API
解决:Date非线程安全、时区处理麻烦、各种格式化和时间计算繁琐、
public void newFormat(){
//format yyyy-MM-dd
LocalDate date = LocalDate.now();
System.out.println(String.format("date format : %s", date));
//format HH:mm:ss
LocalTime time = LocalTime.now().withNano(0);
System.out.println(String.format("time format : %s", time));
//format yyyy-MM-dd HH:mm:ss
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(String.format("dateTime format : %s", dateTimeStr));
}
字符串转日期格式
LocalDate date = LocalDate.of(2021, 1, 26);
LocalDate.parse("2021-01-26");
LocalDateTime dateTime = LocalDateTime.of(2021, 1, 26, 12, 12, 22);
LocalDateTime.parse("2021-01-26 12:12:22");
LocalTime time = LocalTime.of(12, 12, 22);
LocalTime.parse("12:12:22");
Java 8 之前 转换都需要借助 SimpleDateFormat
类,而Java 8 之后只需要 LocalDate
、LocalTime
、LocalDateTime
的 of
或 parse
方法