From 7a35b0099db7bd2946c645e78523ead2aae21619 Mon Sep 17 00:00:00 2001 From: Chant3ll3 <141697333+Chant3ll3@users.noreply.github.com> Date: Thu, 28 Dec 2023 20:25:15 +1100 Subject: [PATCH] translation: Added Chinese Translation for Trampoline Pattern (#2718) * Translated Trampoline README.md to Chinese * Fixed title in README.md --- localization/zh/trampoline/README.md | 135 ++++++++++++++++++ .../zh/trampoline/etc/trampoline_urm.png | Bin 0 -> 15316 bytes 2 files changed, 135 insertions(+) create mode 100644 localization/zh/trampoline/README.md create mode 100644 localization/zh/trampoline/etc/trampoline_urm.png diff --git a/localization/zh/trampoline/README.md b/localization/zh/trampoline/README.md new file mode 100644 index 000000000..fd65c5d4c --- /dev/null +++ b/localization/zh/trampoline/README.md @@ -0,0 +1,135 @@ +--- +title: Trampoline +category: Behavioral +language: zh +tag: +- Performance +--- + +## 目的 + +蹦床模式是用于在 Java 中递归地实现算法,而不会破坏堆栈,并且可以交错地执行函数,而无需将它们编码在一起。 + +## 解释 + +递归是一种常用的技术,用于以分而治之的方式解决算法问题。例如,计算斐波那契累加和与阶乘。在这类问题中,递归比循环更简单直接。此外,递归可能需要更少的代 +码并且看起来更简明。有一种说法是,每个递归问题都可以使用循环来解决,但代价是编写更难以理解的代码。然而,递归型解决方案有一个很大的警告。对于每个 +递归调用,通常需要存储一个中间值,并且可用的栈内存有限。栈内存不足会导致栈溢出错误并停止程序执行。蹦床模式是一种允许在 Java 中定义递归算法而无需破坏 +堆栈的技巧。 + +现实世界例子 + +> 使用蹦床模式进行递归斐波那契计算,不存在堆栈溢出问题。 + +通俗地说 + +> 蹦床模式允许递归而不会耗尽栈内存。 + +维基百科上说 + +> 在 Java 中,蹦床是指使用反射来避免使用内部类,例如在事件侦听器中。反射调用的整理操作时间换成了内部类的整理操作空间。 Java 中的蹦床通常涉及创建 GenericListener 以将事件传递到外部类。 + +**编程实例** + +这是 Java 中的蹦床实现。 + +当在返回的蹦床上调用 `get` 时,只要返回的具体实例是蹦床,内部就会在返回的蹦床上迭代调用跳转,并在返回的实例完成后停止。 + +```java +public interface Trampoline { + + T get(); + + default Trampoline jump() { + return this; + } + + default T result() { + return get(); + } + + default boolean complete() { + return true; + } + + static Trampoline done(final T result) { + return () -> result; + } + + static Trampoline more(final Trampoline> trampoline) { + return new Trampoline() { + @Override + public boolean complete() { + return false; + } + + @Override + public Trampoline jump() { + return trampoline.result(); + } + + @Override + public T get() { + return trampoline(this); + } + + T trampoline(final Trampoline trampoline) { + return Stream.iterate(trampoline, Trampoline::jump) + .filter(Trampoline::complete) + .findFirst() + .map(Trampoline::result) + .orElseThrow(); + } + }; + } +} +``` + +使用蹦床获取斐波那契值。 + +```java +public static void main(String[] args) { + LOGGER.info("Start calculating war casualties"); + var result = loop(10, 1).result(); + LOGGER.info("The number of orcs perished in the war: {}", result); +} + +public static Trampoline loop(int times, int prod) { + if (times == 0) { + return Trampoline.done(prod); + } else { + return Trampoline.more(() -> loop(times - 1, prod * times)); + } +} +``` + +程序输出: + +```java +19:22:24.462 [main] INFO com.iluwatar.trampoline.TrampolineApp - Start calculating war casualties +19:22:24.472 [main] INFO com.iluwatar.trampoline.TrampolineApp - The number of orcs perished in the war: 3628800 +``` + +## 类图 + +![alt text](./etc/trampoline_urm.png "Trampoline pattern class diagram") + +## 适用场景 + +使用蹦床模式时 +* 用于实现尾递归函数。该模式允许切换无堆栈操作。 +* 用于在同一线程上交错执行两个或多个函数。 + +## 现实案例 + +* [cyclops-react](https://github.com/aol/cyclops-react) + +## 鸣谢 + +* [Trampolining: a practical guide for awesome Java Developers](https://medium.com/@johnmcclean/trampolining-a-practical-guide-for-awesome-java-developers-4b657d9c3076) +* [Trampoline in java ](http://mindprod.com/jgloss/trampoline.html) +* [Laziness, trampolines, monoids and other functional amenities: this is not your father's Java](https://www.slideshare.net/mariofusco/lazine) +* [Trampoline implementation](https://github.com/bodar/totallylazy/blob/master/src/com/googlecode/totallylazy/Trampoline.java) +* [What is a trampoline function?](https://stackoverflow.com/questions/189725/what-is-a-trampoline-function) +* [Modern Java in Action: Lambdas, streams, functional and reactive programming](https://www.amazon.com/gp/product/1617293563/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617293563&linkId=ad53ae6f9f7c0982e759c3527bd2595c) +* [Java 8 in Action: Lambdas, Streams, and functional-style programming](https://www.amazon.com/gp/product/1617291994/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617291994&linkId=e3e5665b0732c59c9d884896ffe54f4f) diff --git a/localization/zh/trampoline/etc/trampoline_urm.png b/localization/zh/trampoline/etc/trampoline_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e9c7439a327dac019a1a420eaf460ef2092a52 GIT binary patch literal 15316 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 literal 0 HcmV?d00001