映射后的Java Stream to Array

dan*_*niu 2 java arrays generics java-stream

我有以下代码,这是我偶然发现的一个简化版本:

public class Transforming
{
    static interface MyInterface<T>
    {
        void consume(T... toConsume);
    }

    static abstract class Mapper<T> implements MyInterface<String> {
        MyInterface<T> delegate;

        public Mapper(MyInterface<T> delegateTo)
        {
            delegate = delegateTo;
        }

        public void consume(String... transformFrom)
        {
            T[] array = (T[]) Arrays.stream(transformFrom)
                    .map(this::transform)
                    .toArray(); // can't toArray(T[]::new) here!
            delegate.consume(array);
        }

        protected abstract T transform(String toTransform);
    }
}
Run Code Online (Sandbox Code Playgroud)

关于如何将流转换为数组的搜索明显不足,因为此时我没有生成的数组类型,并且Java不允许我创建泛型类型的数组...

我确实理解这个问题,但有关如何清理代码的任何输入?AFAICT,我的选择是

  • 将接口从varargs更改为List
  • 我在代码示例中使用的演员
  • 向Mapper创建添加IntFunction

我缺少什么?你最喜欢什么?

Mik*_*kis 5

我处理这个问题的方法是始终提供两个重载:

  • 一个接受varargs的人

  • 一个接受一个List<>.

除了将数组打包到列表中并调用List<>重载之外,varargs重载永远不会做任何事情.这使事情变得简单.想都不用想.

所以,基本上,我选择的选项是你的第一个选项,"将界面从varargs更改为List",除了你实际上不需要改变它,你可以通过添加一个重载来扩展它.

  • "不在任何地方调用"或"仅从一个地方调用"不是从接口中删除方法的理由.决定方法是否属于接口的标准完全取决于接口需要提供的功能,而不是取决于呼叫者可能(或可能不)使用的功能.这里的可选功能是varargs功能,它纯粹是为了方便呼叫者而提供的.基本功能是接受列表的功能. (2认同)