사실 복잡한 코드는 아니지만, 방금 작성한 코드를 보다가 문득 이걸 자바로 짰으면 어땠을까 생각해보니 스칼라로 전향하기 잘했다는 기분이 들어서 내용을 공유해봅니다.
스칼라 코드:
def getItems: Seq[ChoiceItem] = {
def asList(name: String) = attrs(name).toSeq.flatMap(_.split(",")).map(_.trim)
(asList("labels") zip asList("values")) map ChoiceItem.tupled
}
case class ChoiceItem(label: String, value: String)
동일한 내용의 자바 버전:
private List<String> asList(String name) {
String values = attrs(name);
if (values == null) {
return Collections.emptyList();
}
String[] list = values.split(",");
List<String> result = new ArrayList<String>();
for (String value : list) {
result.add(values.trim());
}
return result;
}
public List<ChoiceItem> getItems() {
List<String> labels = asList("labels");
List<String> values = asList("values");
assert labels.size() == values.size();
List<ChoiceItem> items = new LinkedList<ChoiceItem>();
for (int i = 0; i < labels.size(); i++) {
items.add(new ChoiceItem(labels.get(i), values.get(i)));
}
return items;
}
...
public class ChoiceItem {
private String label;
private String value;
public ChoiceItem(String label, String value) {
this.label = label;
this.value = value;
}
public String getLabel() {
return label;
}
public String getValue() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ChoiceItem that = (ChoiceItem) o;
if (!label.equals(that.label)) return false;
return value.equals(that.value);
}
@Override
public int hashCode() {
int result = label.hashCode();
result = 31 * result + value.hashCode();
return result;
}
}
스칼라도 나름의 지저분한 구석이 있지만 적어도 컬렉션 다루는 것 만큼은 확실히 간결하고 편하다는 생각이 듭니다.