在 lambda 中使用堆栈时正在打印 FIFO

Son*_*ain 1 lambda java-8

我正在尝试将十进制值转换为二进制值,我已使用堆栈作为数据结构。当使用普通的堆栈弹出时,它以正确的顺序打印我,例如 4 的二进制转换将为 100。但我是 java 8 的新手,并尝试尽可能多地使用 lambda 来学习,并在执行过程中,我意识到它打印 FIFO ex for 4 它正在打印 001。请找到下面的代码并让我知道我哪里做错了。

package com.interview.random;

import java.util.Stack;

public class ConvertDecimalToBinary {

public Stack<Integer> convertToBinary(int num){
    Stack<Integer> st=new Stack<>();
    while(num>1){
        st.push(num%2);
        num=num/2;
    }
    st.push(num);
    return st;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Stack<Integer> st=new ConvertDecimalToBinary().convertToBinary(4);

    //printing correctly
    while(!st.isEmpty()){
        System.out.println(st.pop());
    }

    //Printing in FIFO not correct 
    st.forEach(i->System.out.println(i));
}
Run Code Online (Sandbox Code Playgroud)

}

Ste*_*n C 5

a 的迭代顺序Stack是 FIFO。Stackjavadocs中没有明确说明这一点,但这就是实现的作用。

然而,Stackjavadoc 确实是这么说的:

“该接口及其实现提供了一组更完整、更一致的 LIFO 堆栈操作Deque,应优先使用该类。”

API提供了两种迭代Deque,一种用于 FIFO 顺序,另一种用于 LIFO 顺序。该Deque::forEach方法被指定为按 FIFO 顺序访问,但您可以这样做:

dq.reverseIterator().forEachRemaining(i->System.out.println(i));

  • 不要忘记,`java.util.Stack`只是一个扩展的`java.util.Vector`,提供了一些在列表末尾添加和删除的方法。多次调用 `push(...)` 与多次调用 `add(...)` 没有什么不同,并且 `Vector.forEach(...)` 仍然按照添加的顺序迭代元素。当您查看[文档](https://docs.oracle.com/javase/8/docs/api/?java/util/Stack.html)时,您可以清楚地看到“Stack”添加或覆盖了哪些方法` 并且继承自 `Vector`。所有继承的方法仍然具有列表语义。 (4认同)
  • 我已经解释过了。`Stack` 的 **迭代** 顺序是 FIFO。但是(显然)当您使用“push”和“pop”时,顺序是 LIFO。 (2认同)