java - 如何在 java 静态方法中扩展数据结构以使其变得惰性?

标签 java static clojure lazy-evaluation

我正在尝试用更惯用的 Clojure 包装外部库。这包括使其数据结构变得惰性。我想进入下面的 read 静态方法并使 FooList 变得惰性。

我遇到了很多问题:

  1. Java 静态方法无法被重写
  2. 代理似乎只生成实例对象
  3. gen-class 似乎有点工作,但我迷失在命名空间、别名等的海洋中。
  4. 相关方法调用另一个静态和私有(private)方法(我想重用它),使得重写公共(public)方法变得困难。

做到这一点的最佳策略是什么?是否可以打开 FooList 并将其重新实现为惰性,并且生成的类可供我的代码的其余部分使用?

org.apache.commons.collections.list.LazyList似乎适合该任务,但我不确定如何实际使用它。

帮忙?

public class Foo {

    public static FooList read(String filename) {
        FooList foos = new FooList(); //FooList extends ArrayList
        BufferedReader br = new BufferedReader(new FileReader(filename));

        for (String s = br.readLine(); null != s; s = br.readLine()) {
            Foo f = parseLine(s);
            foos.add(f);
        }

        br.close();
        return foos;
    }

    private static Foo parseLine(String s) {
        //return s as Foo
    }
}

最佳答案

可能完全超出了你的范围,但我有一个similar problem 。所以我的最终选择是使用 java.lang.Iterable,如果你想得更深入,它完全符合惰性标准。是的,它没有 List 所具有的一些东西(例如 size()),但为了简单起见,我可以牺牲这一点。回想起来,我从不后悔自己的选择。

关于java - 如何在 java 静态方法中扩展数据结构以使其变得惰性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4624021/

相关文章:

java - https 在生产模式下运行需要很长时间

java - 在 JasperReports 5.6.1 中打印二维码

java - 我应该先关闭哪个,PreparedStatement 还是 Connection?

php - 在 CakePHP 中多次提交请求后将变量设置为静态?

Clojure.test 抛出?不在 repl 中工作

java - Chrome 驱动程序 "The driver is not executable"

javascript - Pyramid 无法访问静态 Assets (既不是 .jpg 图像也不是 .js 文件)

C++:静态库和动态库(编译运行)

multithreading - 何时使用非阻塞 >!/线程和阻塞>!!/带有 clojure core.async 的 goroutines

list - 如何在 Clojure 中将 '( ' (...) '(...) ... ) 转换为 [...] [...] ... ]?