Как использовать scala.collection.JavaConverters в intellij? - PullRequest
1 голос
/ 24 июня 2019

Я хочу использовать java nio в scala, я пытаюсь преобразовать этот код в scala:

ServerSocketChannel ssChannel = ServerSocketChannel.open();
int port = 9001;
ssChannel.bind(new InetSocketAddress(port));
Selector selector = Selector.open();

ssChannel.configureBlocking(false);
ssChannel.register(selector, SelectionKey.OP_ACCEPT); 

while (true) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
  if (key.isAcceptable()) { 
    ServerSocketChannel ssc = (ServerSocketChannel) key
    .channel();
    SocketChannel sc = ssc.accept();
    sc.configureBlocking(false);
    sc.register(selector, SelectionKey.OP_READ); 
  }
  if(key.isReadable()){ 
    SocketChannel sc = (SocketChannel) key.channel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    sc.read(buffer);

    buffer.flip();
    sc.write(buffer);
  }
}
keys.clear();
}
}

когда я копирую этот код в intellij, intellij спрашивает меня, хочу ли я преобразовать этот код в scala,Я согласен.

тогда intellij

import scala.collection.JavaConversions._,

и скажите мне красную ошибку

Я использую scala 2.12.7 в intellij, я проверяю scala api doc, JavaConversion имеетустарел, поэтому я

import scala.collection.JavaConverters._

но intellij скажите, что он устарел, позвольте мне использовать

scala.jdk.CollectionConverters

, когда я импортирую это, в строке все еще есть ошибка:

key.isAcceptable

как конвертировать этот код в intellij? Спасибо!

Моя версия intellij - 2018.3.4 Community Edition

1 Ответ

0 голосов
/ 24 июня 2019

Вот довольно наивный, построчный перевод вашего Java-кода.

Я не знаю, выполняет ли он то, что вам нужно, я не особо занимался NIO или не вмешивался в Java-land, довольно долго, но он компилируется.

import java.nio.channels.{ServerSocketChannel,Selector,SelectionKey,SocketChannel}
import java.net.InetSocketAddress
import java.nio.ByteBuffer
import collection.JavaConverters._

val ssChannel :ServerSocketChannel = ServerSocketChannel.open()
val port = 9001
ssChannel.bind(new InetSocketAddress(port))
val selector :Selector = Selector.open()

ssChannel.configureBlocking(false)
ssChannel.register(selector, SelectionKey.OP_ACCEPT)

while (true) {
  selector.select()
  val keys :collection.mutable.Set[SelectionKey] = selector.selectedKeys().asScala
  for (key <- keys) {
    if (key.isAcceptable()) {
      val ssc :ServerSocketChannel = key.channel().asInstanceOf[ServerSocketChannel]
      val sc :SocketChannel = ssc.accept()
      sc.configureBlocking(false)
      sc.register(selector, SelectionKey.OP_READ)
    }
    if(key.isReadable()){
      val sc :SocketChannel = key.channel().asInstanceOf[SocketChannel]
      val buffer :ByteBuffer = ByteBuffer.allocate(1024)
      sc.read(buffer)
      buffer.flip()
      sc.write(buffer)
    }
  }
  keys.clear()
}

Вы заметите, что в этом примере JavaConverters используется только для получения Scala mutable.Set от Java Set и это необходимо только для того, чтобы заставить foreach() (внутреннее для понимания) работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...