Posted at

EntrySetが便利な件


Map

ListとMapといえば有名なアレですけども

ListならできるのにMapのkeySetならできないみたいなこと、実は結構おおくて不便に感じません?

そんなときにEntrySetです

keySetより処理早いらしいので何もなくてもおぬぬめ


やってみよう


EntrySet.java

package entrySet;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

/**
* To practice Map
*
* @author me
*
*/

public class practiceMap {
/**
* main
*
* @param args
*/

public static void main(String[] args) {
run();
}

/**
* run

* @throws NumberFormatException if conversion to numeric number is impossible.
*/
private static void run() throws NumberFormatException {
int sum = generate.get().entrySet().stream().filter(Objects::nonNull).map(avoidNullSum)
.collect(Collectors.summingInt(Integer::intValue));
echo.accept(sum);
}

/** Generate Map */
static Supplier<Map<Integer, String>> generate = () -> {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(null, null);
map.put(1, "1");
map.put(2, "2");
map.put(3, "3");
map.put(4, "4");
map.put(5, "5");
return map;
};
/** Avoid null and sum */
static Function<Entry<Integer, String>, Integer> avoidNullSum = v -> Optional.ofNullable(v.getKey()).orElse(1)
+ Integer.parseInt(Objects.toString(v.getValue(), "1"));
/** Output */
static Consumer<Object> echo = v -> System.out.println(v);

}


主にここに注目です

    /** Avoid null and sum */

static Function<Entry<Integer, String>, Integer> avoidNullSum = v -> Optional.ofNullable(v.getKey()).orElse(1)
+ Integer.parseInt(Objects.toString(v.getValue(), "1"));

null回避してるので見にくいかもしれませんが

EntrySetとは、のSetのことで

繰り返し処理中のみつかえるものです。

ようは

List<Integer, String>

みたいなもんです

<Integer, String>の組み合わせを一つずつあつかうループになるわけですね

こっちのがわかりやすいかもです


Wakaru.java

package entrySet;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Supplier;

public class Wakaru {
public static void main(String[] args) {
for (Entry<Integer, String> model : generate.get().entrySet()) {
model.getKey();
model.getValue();
}
}
/** Generate Map */
static Supplier<Map<Integer, String>> generate = () -> {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(null, null);
map.put(1, "1");
map.put(2, "2");
map.put(3, "3");
map.put(4, "4");
map.put(5, "5");
return map;
};
}


Optionalもstreamも捨てるとまじで旧時代のコードに見えてくる...w