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));
广告
将在 10 秒后关闭
bannerAds