CustomFunctions.java

package com.github.mygreen.supercsv.expression;

import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
import java.util.stream.Collectors;

import com.github.mygreen.supercsv.cellprocessor.format.TextPrinter;

/**
 * EL式中で利用可なユーティリティ関数。
 * 
 * @since 2.0
 * @author T.TSUCHIE
 *
 */
public class CustomFunctions {
    
    /**
     * 文字列がnullの場合に空文字に変換する。
     * <pre class="highlight"><code class="java">
     *     CustomFunctions.defaultString(null) = ""
     *     CustomFunctions.defaultString("") = ""
     *     CustomFunctions.defaultString("abc") = "abc"
     * </code></pre>
     * 
     * @param text 判定対象の文字列
     * @return 非nullの場合は、引数の値をそのまま返す。
     */
    public static String defaultString(final String text) {
        if(text == null) {
            return "";
        }
        
        return text;
    }
    
    /**
     * int型の配列の値を結合する。
     * @param array 結合対象の配列
     * @param delimiter 区切り文字
     * @return 結合した文字列を返す。結合の対象の配列がnulの場合、空文字を返す。
     */
    public static String join(final int[] array, final String delimiter) {
        
        if(array == null || array.length == 0) {
            return "";
        }
        
        String value = Arrays.stream(array)
                .boxed()
                .map(String::valueOf)
                .collect(Collectors.joining(defaultString(delimiter)));
        
        return value;
    }
    
    /**
     * 配列の値を結合する。
     * @param array 結合対象の配列
     * @param delimiter 区切り文字
     * @return 結合した文字列を返す。結合の対象の配列がnulの場合、空文字を返す。
     */
    public static String join(final Object[] array, final String delimiter) {
        
        if(array == null || array.length == 0) {
            return "";
        }
        
        String value = Arrays.stream(array)
                .map(v -> v.toString())
                .collect(Collectors.joining(defaultString(delimiter)));
        
        return value;
    }
    
    /**
     * 配列の値を結合する。
     * @param array 結合対象の配列
     * @param delimiter 区切り文字
     * @param printer 配列の要素の値のフォーマッタ
     * @return 結合した文字列を返す。結合の対象の配列がnulの場合、空文字を返す。
     * @throws NullPointerException {@literal printer is null.}
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static String join(final Object[] array, final String delimiter, final TextPrinter printer) {
        
        Objects.requireNonNull(printer);
        
        if(array == null || array.length == 0) {
            return "";
        }
        
        String value = Arrays.stream(array)
                .map(v -> printer.print(v))
                .collect(Collectors.joining(defaultString(delimiter)));
        
        return value;
    }
    
    /**
     * コレクションの値を結合する。
     * @param collection 結合対象のコレクション
     * @param delimiter 区切り文字
     * @return 結合した文字列を返す。結合の対象のコレクションがnulの場合、空文字を返す。
     */
    public static String join(final Collection<?> collection, final String delimiter) {
        
        if(collection == null || collection.isEmpty()) {
            return "";
        }
        
        String value = collection.stream()
                .map(v -> v.toString())
                .collect(Collectors.joining(defaultString(delimiter)));
        
        return value;
    }
    
    /**
     * コレクションの値を結合する。
     * @param collection 結合対象のコレクション
     * @param delimiter 区切り文字
     * @param printer コレクションの要素の値のフォーマッタ
     * @return 結合した文字列を返す。結合の対象のコレクションがnulの場合、空文字を返す。
     * @throws NullPointerException {@literal printer is null.}
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static String join(final Collection<?> collection, final String delimiter, final TextPrinter printer) {
        
        Objects.requireNonNull(printer);
        
        if(collection == null || collection.isEmpty()) {
            return "";
        }
        
        String value = collection.stream()
                .map(v -> printer.print(v))
                .collect(Collectors.joining(defaultString(delimiter)));
        
        return value;
    }
    
}