集合:把 Stream 管道翻译成推导式
List.of → list,HashMap → dict,Stream 管道 → 推导式。这是 Java 开发者效率提升最大的一课。
15 分钟 · 右栏代码可点击「运行」
| Java | Python | 备注 |
|---|---|---|
| ArrayList<T> | list | 可变长度数组,天然混合类型 |
| HashMap<K,V> | dict | 3.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);45List<String> langs = List.of("Java", "Go");6for (String s : langs) {7 System.out.println(s);8}
Python
1scores = {"py": 1}2# 不存在则新建,存在则覆盖3scores["go"] = 24# 仅在不存在时写入5scores.setdefault("rs", 0)67langs = ["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());67Map<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) > 33) # 生成器表达式 + sorted()45by_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)。
练一练
这张卡的示例代码已在游乐场中备好,改一改再运行。