PyPyBridge

集合:把 Stream 管道翻译成推导式

List.of → list,HashMap → dict,Stream 管道 → 推导式。这是 Java 开发者效率提升最大的一课。

15 分钟 · 右栏代码可点击「运行」


JavaPython备注
ArrayList<T>list可变长度数组,天然混合类型
HashMap<K,V>dict3.7+ 保持插入顺序
HashSet<T>set去重、交并差
ArrayDeque<T>collections.deque双端队列
List.of(...)tuple不可变序列
Optional<T>None + Optional[T]见类型一课

构建与访问

Java
1Map<String, Integer> scores = new HashMap<>();
2scores.put("py", 1);
3scores.putIfAbsent("go", 2);
4
5List<String> langs = List.of("Java", "Go");
6for (String s : langs) {
7 System.out.println(s);
8}
Python
1scores = {"py": 1}
2# 不存在则新建,存在则覆盖
3scores["go"] = 2
4# 仅在不存在时写入
5scores.setdefault("rs", 0)
6
7langs = ["Java", "Go"]
8for s in langs: # 直接遍历元素
9 print(s)
  • 取值时 scores["py"] 不存在会抛 KeyError,取代 getOrDefault 的是 scores.get("py", 0)

Stream 管道 → 推导式(最重要的一处翻译)

Java
1List<String> result = names.stream()
2 .filter(n -> n.length() > 3)
3 .map(String::toUpperCase)
4 .sorted()
5 .collect(Collectors.toList());
6
7Map<String, Integer> byName = names.stream()
8 .collect(toMap(n -> n, String::length));
Python
1result = sorted(
2 n.upper() for n in names if len(n) > 3
3) # 生成器表达式 + sorted()
4
5by_name = {n: len(n) for n in names} # dict 推导式
  • [表达式 for x in xs if 条件] 就是 filter+map+collect 的合体,可读性完胜管道。
  • 要惰性求值(不 collect)时用圆括号:(f(x) for x in xs) 是生成器,近似无终端操作的 Stream。

注意

不要用 Java 的方式遍历for i in range(len(xs)) 在 Python 里是坏味道。直接 for x in xs;要下标用 enumerate(xs);并行遍历两个列表用 zip(a, b)

练一练

这张卡的示例代码已在游乐场中备好,改一改再运行。

在游乐场中打开