LoginSignup
1
1

StringUtilはどんなものがいいのか

Last updated at Posted at 2019-10-11

##これさえあればなんでもできるみたいなメソッド欲しい
欲しくない?

##どんなものがいいのか
型が違うとかはもうどうしようもないので
Stringに関してならなんでも、安全に処理できる
みたいなことを目的とします

##とりあえずやってみる

StringUtils.java
package utils;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.Arrays;
import java.util.HashMap;

/**
 * Stringならまかせとけクラス
 * 
 * @author Mr.汎用性の極み
 *
 */
public class StringUtils {

	/** 複数 文字列引数 */
	private static final List<String> MULTIPLE_STRING = Arrays.asList("a", null, "b", "", "3");

	/**
	 * 実験用
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(extraction(MULTIPLE_STRING));
	}

	/**
	 * {@code null}をブランクに変換.<br>
	 * {@code null}でないものはそのまま.
	 * 
	 * @param str 入力される文字列
	 * @return 変換結果
	 */
	private static String nullToBlank(String str) {
		return Objects.toString(str, "");
	}

	/**
	 * {@code null}をブランクに変換.<br>
	 * {@code null}でないものはそのまま.
	 * <p>
	 * 引数自体が{@code null}または要素数0の場合,空のリストを返す.
	 * 
	 * @param list 入力される{@code List<String>}
	 * @return 変換結果
	 */
	private static List<String> nullToBlank(List<String> list) {
		if (list != null)
			return list.stream().map(StringUtils::nullToBlank).collect(Collectors.toList());
		return Arrays.asList();
	}

	/**
	 * 入力された{@code List<String>}において<br>
	 * {@code null}と空文字を排除する
	 * 
	 * @param list 入力される{@code List<String>}
	 * @return 変換結果
	 */
	private static List<String> nullBlankSmasher(List<String> list) {
		return nullToBlank(list).stream().filter(v -> !v.isEmpty()).collect(Collectors.toList());
	}

	/**
	 * {@code Map<String, Integer>}に対して
	 * <p>
	 * <ul>
	 * <li>入力された文字列が数値変換可能な場合<br>
	 * {空文字, 変換後の数値}を返す<br>
	 * <li>入力された文字列が数値変換不可能な場合<br>
	 * {変換前の文字列, {@code null}}を返す
	 * </ul>
	 * 
	 * @param map 格納用のマップ
	 * @param str 数値変換対象の文字列
	 */
	private static void store(Map<String, Integer> map, String str) {
		try {
			map.put("", Integer.parseInt(str));
		} catch (NumberFormatException e) {
			map.put(str, null);
		}
	}

	/**
	 * 数値変換可能なものを変換し、そうでないものは不変のまま仕分ける.
	 * <p>
	 * <ul>
	 * <li>入力された文字列が数値変換可能な場合<br>
	 * {空文字, 変換後の数値}を返す<br>
	 * <li>入力された文字列が数値変換不可能な場合<br>
	 * {変換前の文字列, {@code null}}を返す
	 * </ul>
	 * 
	 * @param list 入力される{@code List<String>}
	 * @return 仕分け結果
	 */
	private static Map<String, Integer> toInteger(List<String> list) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		nullBlankSmasher(list).forEach(v -> {
			store(map, v);
		});
		return map;
	}

	/**
	 * 入力された文字列のリストに対して以下の操作を行う
	 * <p>
	 * <ul>
	 * <li>{@code null}と空文字を除去
	 * <li>数値変換可能な文字列を数値に変換
	 * <li>変換できなかった文字列のリストと,数値変換後の数値のリストのマップを返す
	 * </ul>
	 * 
	 * @param list 入力される{@code List<String>}
	 * @return 仕分け結果
	 */
	private static Map<List<String>, List<Integer>> extraction(List<String> list) {
		Map<List<String>, List<Integer>> map = new HashMap<List<String>, List<Integer>>();
		map.put(toInteger(list).keySet().stream().filter(v -> !v.isEmpty()).collect(Collectors.toList()),
				toInteger(list).values().stream().filter(Objects::nonNull).collect(Collectors.toList()));
		return map;
	}

}

##なにこれ
とりま作ったのは

入力値:List
出力値;Map, List>
処理:
入力された文字列のリスト内の要素で数値変換可能なものがあった場合数値に変換
変換できないものはそのままに
文字列のリストと数値のリストに分け、マップに格納する

##意識したこと
入力値がnull,要素数0でも大丈夫なような対応
一気に作らず、部分ごとに分けてつくり
一部分のみ使いたいときに対応できるようにした

##だめなところ
Object型やOptionalを用いてもっと汎用的な窓口にしてみたかったりする

まぁ難しいですね、、

万能薬欲しい

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1