【问题标题】:What is the equivalent of Rust's Option::iter in Java?Java 中 Rust 的 Option::iter 等价物是什么?
【发布时间】:2014-12-13 17:39:51
【问题描述】:

我在Rust中有以下代码,我想把它翻译成Java,所以我首先需要理解代码。

pub struct SimpleSelector {
    pub tag_name: Option<String>,
    pub id: Option<String>,
    pub class: Vec<String>,
}

impl Selector {
    pub fn specificity(&self) -> Specificity {
        // http://www.w3.org/TR/selectors/#specificity
        let Selector::Simple(ref simple) = *self;
        let a = simple.id.iter().len();
        let b = simple.class.len();
        let c = simple.tag_name.iter().len();
        (a, b, c)
    }
}

我在这行代码中遇到问题:

let a = simple.id.iter().len();

【问题讨论】:

标签: java rust


【解决方案1】:

如果Option&lt;String&gt; 有一个值,那么它的迭代器将有一个要迭代的元素。

如果Option&lt;String&gt;没有值,那么它的迭代器将有0个元素要迭代。

换句话说,let a = simple.id.iter().len(); 中的 asimple.id 中元素的计数,如果有 id,则为 1,如果没有,则为 0。

len的实际计算发生在Item.size_hint,你可以看到它的来源here)。

如果是 Java,您可以使用 null,如

public class SimpleSelector {
  public String tag_name;
  public String id;
  public ArrayList<String> clazz;
}
// ...
int a = id == null ? 0 : 1;

或来自 Java 8 的 Optional,如

public class SimpleSelector {
  public Optional<String> tag_name;
  public Optional<String> id;
  public ArrayList<String> clazz;
}
// ...
int a = id.empty() ? 0 : 1;

【讨论】:

    【解决方案2】:

    作为对@ArtemGr 答案的补充,您还可以将Option 视为只能包含0 或1 个值的集合。 Java 代码可能如下所示:

    public class SimpleSelector {
      public ArrayList<String> tag_name;
      public ArrayList<String> id;
      public ArrayList<String> clazz;
    }
    // ...
    int a = id.size();
    

    使用null 是许多人的首选,但与Option 相比,它有一个缺点。在 Rust 中,这永远不会编译:

    fn thing(id: Option<String>) {
      id.len(); // id could be `Some` or `None`!
    }
    

    但是在 Java 中 null-using 等效项可以编译,但可能会在运行时崩溃:

    public static void thing(String id) {
      id.length();  // id could be null or not-null!
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 2021-03-11
      • 2022-06-12
      • 2011-11-28
      • 2023-01-17
      • 2022-11-03
      • 2021-10-18
      • 2010-12-07
      相关资源
      最近更新 更多