Java笔记
备忘录。
#Java: Java is a popular programming language that is widely used.
流API
// In: List<SalesLine>
// Out: 商品コードをキー、販売数合計を値とするマップ
Map<String, Integer> map =
list.stream().collect(
Collectors.groupingBy(SalesLine::getProductCode,
Collectors.summingInt(SalesLine::getQuantity)
));
全角和半角的转换等
Normalizer.normalize(q, Normalizer.Form.NFKC);
使用NUL字符拆分字符串化
String messages = errors.getAllErrors().stream().map(e -> e.getDefaultMessage()).collect(Collectors.joining(new String(new char[] {0}) ));
List<String> list = messages.split(new String(new char[] {0}));
BigDecimal的小数点后位数四舍五入(舍入方式)
Predicate<Object> isNull = Objects::isNull;
IntFunction<Function<RoundingMode, Function<BigDecimal, BigDecimal>>> setScale = i -> r -> n -> ((BigDecimal) isNull.test(n) ? BigDecimal.ZERO : n)).setScale(i, r);
给三位数加上逗号。
Predicate<Object> isNull = Objects::isNull;
Predicate<Object> isNumber = obj -> obj instanceof Number;
final Function<Object, String> addComma = obj -> {
if (isNull.or(isNumber.negate()).test(obj)) {
return null;
}
if (obj instanceof BigDecimal) {
return String.format("%,d", ((BigDecimal) obj).longValueExact());
}
return String.format("%,d", obj);
};
判断数值类型是否为零
Predicate<Object> isNull = Objects::isNull;
Predicate<Object> isNumber = obj -> obj instanceof Number;
Predicate<Object> isNumberZero = obj -> {
if (isNull.or(isNumber.negate()).test(obj)) {
return false;
}
if (obj instanceof BigDecimal) {
return BigDecimal.ZERO.compareTo((BigDecimal) obj) == 0;
}
return Objects.equals((long) obj, 0L);
};
将Map中的BigDecimal相加。
hogeMap.merge("key1", BigDecimal.ONE, (BigDecimal sum, BigDecimal val) -> sum.add(val));
将其转换为BigDecimal
private BigDecimal toBigDecimal(final Object n) {
if (Objects.isNull(n)) {
return BigDecimal.ZERO;
}
if (n instanceof java.lang.String) {
return new BigDecimal((String) n);
}
else if (n instanceof Number) {
return BigDecimal.valueOf((Long) n);
}
return BigDecimal.ZERO;
}
用于检测对象不一致的判定
BiPredicate<Object, Object> isNotEquals = ((BiPredicate<Object, Object>)Objects::equals).negate();
深度复制
使用java.util.Arrays进行深拷贝。
int[] copySrc = new int[5];
Arrays.fill(copySrc, 0);
int[] copyDst = Arrays.copyOf(copySrc, copySrc.length);
对象的深度复制
使用org.apache.commons.lang3.SerializationUtils#clone进行深拷贝。
public Object deepCopy(Serializable state) {
return SerializationUtils.clone(state);
}
优先级队列-优先级队列
我不太了解如何有效地使用它。
AtCoder Regular Contest 028 – B – 似乎对解决特别奖有所帮助。
PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>();
pQueue.offer(i); // 追加
pQueue.peek(i); // 取得(キューから削除しない)
pQueue.poll(i); // 取得(キューから削除する)
请参阅Dijkstra算法。(Simplified Chinese: 请参阅迪杰斯特拉算法。)
展示对象的内容
// commons-lang
System.out.println(ToStringBuilder.reflectionToString(new Hoge()));
// hoge$Hoge@cafb56[id=1,value=hoge,strValues={aaa,bbb,ccc},items=[ddd, eee, fff]]
为对象分配哈希码。
public class Clazz implements Serializable {
private static final long serialVersionUID = 1L;
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
可以简单地写出对象的匹配判断
public class Hoge implements Serializable {
private static final long serialVersionUID = 1L;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}
进行值的判断和区别
请使用Enum。是的吧~
if ( Arrays.asList("Cat", "Dog", "Pig").contains(hoge) ) {
// Do somthings.
}
初始化List
List<String> list = new ArrayList<>(Arrays.asList("Cat", "Dog", "Pig"));
文件名按升序排序
// ファイル名 昇順にソート
List<File> csvFileList = new ArrayList<File>();
csvFileList.add( new File("###") );
csvFileList.add( new File("BBB") );
csvFileList.add( new File("111") );
csvFileList.add( new File("AAA") );
Collections.sort( csvFileList, new Comparator<File>(){
@Override
public int compare( File o1, File o2 ) {
return StringUtils.compare( o1.getName(), o2.getName() );
}
});
IterableUtils.forEach( csvFileList, new Closure<File>(){
@Override
public void execute( File file ) {
System.out.println( ReflectionToStringBuilder.toString( file ) );
}
});
春天
获取资源文件
@Autowired
ResourceLoader resourceLoader;
final Resource resource = resourceLoader.getResource("classpath:path/to/file");
将BindingResult的消息转换为字符串数组。
# org.springframework.validation.BindingResult errors;
setMessages(errors.getAllErrors().stream().map(e -> e.getDefaultMessage()).toArray(String[]::new));