Java常见问题的简单解法
提示:总结于LeetCode书籍《Java常见问题的简单解法》,全书其实就是用Stream去通过函数式编程,更加简洁,快速,高效的解决实际问题。
文章目录
第五章 流式操作、lambda 表达式与方法引用的相关问题
一、Java.util.Objects是什么?
Java.util.Objects的相关方法:
1.deepEquals
static boolean deepEquals(Object a, Object b)
验证俩个数组是否相等,该方法在数组中尤其有用。数组A和数组B对应的元素都相等时,才返回true,A和B都是null也返回true,否则返回false
//栗子:
String[] a=new String[]{"123","456","789"};
String[] b=new String[]{"123","456","789"};
//返回false
boolean result=a.equals(b);
//返回true
boolean result2=Objects.deepEquals(a, b);
//返回false
boolean result3=Objects.deepEquals(null, b);
//返回true
boolean result4=Objects.deepEquals(null, null);
2.equals
验证俩个参数是否相等,它是空安全(null safe)的。
//返回false
boolean result=Objects.equals(对象A, 对象B);
//返回false
boolean result2=Objects.equals(null, 对象B);
//返回true
boolean result3=Objects.equals(null, null);
3.toString
如果参数不为 null 则返回调用 toString 的结果,否则返回 null。
static String toString(Object o)
如果第一个参数不为 null,返回调用 toString 的结果;如果第一个参数为 null,返回第二个参数。
static String toString(Object o, String nullDefault)
4.requireNonNull
如果参数不为 null 则返回 T,否则抛出 NullPointerException。
static <T> T requireNonNull(T obj, String message)
与上一个方法相同,但由于参数为 null 而抛出的 NullPointerException 将显示指定的消息。
static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)
第一个参数为 null,则调用给定的 Supplier 为 NullPointerException 生成消息。
static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)
5.isNull
如果提供的引用为 null 则返回 true,否则返回 false。
static boolean isNull(Object obj)
6.nonNull
如果提供的引用不为 null 则返回 true,否则返回 false。
static boolean nonNull(Object obj)
返回集合和过滤空元素:
List<String> strings = Arrays.asList(
"this", null, "is", "a", null, "list", "of", "strings", null);
List<String> nonNullStrings = strings.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
//输出结果:
//[this, is, a, list, of, strings]
二、Map接口
1.computeIfAbsent
V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
在创建方法调用结果的缓存时,computeIfAbsent尤其有用。 如果键的值在缓存中存在,返回对应的值,否则计算新的值并保存
//斐波拉契数递归计算
long fib(long i) {
if (i == 0) return 0;
if (i == 1) return 1;
return fib(i - 1) + fib(i - 2); ➊
}
//使用computeIfAbsent计算斐波拉契数
private Map<Long, BigInteger> cache = new HashMap<>();
public BigInteger fib(long i) {
if (i == 0) return BigInteger.ZERO;
if (i == 1) return BigInteger.ONE;
return cache.computeIfAbsent(i, n -> fib(n - 2).add(fib(n - 1)));
}
2.computeIfPresent
V computeIfPresent(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction)
仅当与某个值关联的键在 Map 中存在时,computeIfPresent 才会更新该值。
public Map<String,Integer> countWords(String passage, String... strings) {
Map<String, Integer> wordCounts = new HashMap<>();
//将特定单词置于映射中,并将计数器设置为 0
Arrays.stream(strings).forEach(s -> wordCounts.put(s, 0));
//读取文本,仅更新特定单词的出现次数
Arrays.stream(passage.split(" ")).forEach(word ->
wordCounts.computeIfPresent(word, (key, val) -> val + 1));
return wordCounts;
}
String passage = "NSA agent walks into a bar. Bartender says, " +
"'Hey, I have a new joke for you.' NSA agent says, 'heard it'.";
Map<String, Integer> counts = demo.countWords(passage, "NSA", "agent", "joke");
counts.forEach((word, count) -> System.out.println(word + "=" + count));
//输出为:NSA=2, agent=2, joke=1
3.replace
V replace(K key, V value)
boolean replace(K key, V oldValue, V newValue)
对于第一种形式,如果键在映射中存在,则将其替换为对应的值;对于第二种形式,如果键的值与指定的值相等,则将其替换为新的值。
4.getOrDefault
V getOrDefault(Object key, V defaultValue)
如果键在映射中不存在,getOrDefault方法将返回默认值,但不会将这个键添加到映射中。
5.merge
V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction)
key:-键
value:-值
remappingFunction:-重新映射函数,用于计算值
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// 创建一个 HashMap
HashMap<String, String> countries = new HashMap<>();
// 往HashMap插入映射项
countries.put("Washington", "America");
countries.put("Canberra", "Australia");
countries.put("Madrid", "Spain");
System.out.println("HashMap: " + countries);
//合并 key为 Washington的映射
String returnedValue = countries.merge("Washington", "USA", (oldValue, newValue) -> oldValue + "/" + newValue);
System.out.println("Washington: " + returnedValue);
//输出更新后的HashMap
System.out.println("Updated HashMap: " + countries);
//输出为:
//HashMap: {Madrid=Spain, Canberra=Australia, Washington=America}
//Washington: America/USA
//Updated HashMap: {Madrid=Spain, Canberra=Australia, Washington=America/USA},
}
}