java 8 부터 추가된 stream API 의 peek, map을 사용하던 도중 sonaLint를 통하여 peek사용과 map 사용이 잘못된 부분을 확인함. 해당 API를 이런식으로 사용한 이유는 객체의 내부 값을 순차적으로 적용하고 싶었음. 하지만 문제가 발생할 수 있다는 점을 sonaLint에서 발견함.

static <T> ClassModel[] createClassModels(Class<T> clazz) {
    Function<Field, ClassModel> classModelSupplier = ClassModel::new;
    SheetStyleConfigurer sheetStyle = ClassModel.createSheetStyle(clazz);
    AtomicInteger atomicInteger = new AtomicInteger(0);

    return ReflectionUtils.getDeclaredFields(clazz)
            .stream()
            .filter(field -> field.isAnnotationPresent(Column.class))
            .map(classModelSupplier)
            .map(ClassModel :: setColumn)
            .map(ClassModel :: setDefaultValue)
            .map(ClassModel :: setFieldName)
            .map(classModel -> classModel.setPriority(atomicInteger.getAndIncrement()))
            .map(classModel -> classModel.setSheetStyleConfigurer(sheetStyle))
            .map(ClassModel :: setCellStyleConfigurer)
            .map(ClassModel :: setCellFormat)
            .toArray(ClassModel[] :: new);
}

해당 API의 사용이 문제가 되는 이유

Untitled

private List<Structure> createStructures(Class<?> clazz) {
    AtomicInteger atomicInteger = new AtomicInteger(0);
    return ReflectionUtils.getDeclaredFields(clazz)
            .stream()
            .filter(Structure ::existsColumnAnnotation)
            .map(field -> new Structure(clazz, field, atomicInteger.getAndIncrement()))
            .collect(Collectors.toList());
}