Не совсем так. Третий пример не эквивалентен первому. Например, когда S имеет ложное значение.
Пример:
>>> A = 0
>>> S = 1
>>> B = 'hi'
>>> A if S else B
0
>>> ((A and S) or B)
'hi'
Второй пример будет работать медленнее, чем первый. Т.к. в первом используется сокращённая схема вычислений, а во втором полная.
Короче говоря, иметь представление об альтернативных вариантах — полезно. Т.к. они могут встретиться в старом коде (когда тернарный оператор ещё не был введён). Но в новом коде следует использовать только первый вариант. Читаемость кода — это тоже немаловажный фактор, согласитесь ;)
Чтобы что-то развалить — для начала нужно построить ;)
Пока же немного настораживает обилие громких слов.
Хотя с тругой стороны автор говорит о наличии опыта.
В любом случае эксперимент интересный! :) Хотелось бы поучавствовать.
Хочу сказать спасибо за эту статью! Она сподвигла меня на некие действия. Во-первых благодаря ней я-таки съездил в магазин и купил книгу «JAVA 2 Тонкости программирования» второй том. Когда бы иначе я до этого дошёл? ))
Взялся за третью задачу. Т.к. первые две для меня не интересны.
Впервые стал разбираться с многопоточностью.
Первые три подзадачи сделал. А вот на четвёртом пункте подзастрял. Пока не могу сообразить как сделать так, чтобы введённое одним пользователем — выводилось сразу у всех. Нужно как-то передавать информацию между потоками. Как это обычно делается? Т.е. чтобы один поток пробуждал все остальные.
Подсказки от вас могут быть? =) Вот реализация первых трёх пунктов. Она немного изменена, т.к. я работал над четвёртым. Запись в файл, к примеру, в первых трёх пунктах не нужна. Пока не пойму потребуется ли она вдальнейшем.
Класс chat
package ru.chat;
import java.io.*;
import java.net.*;
public class chat {
public static void main(String args[]){
try{
int i =1;
ServerSocket s = new ServerSocket(1234);
while (true){
Socket incoming = s.accept();
System.out.println(«Swaping „+i);
Runnable r = new ThreadedChatHandler(incoming);
Thread t = new Thread®;
t.start();
i++;
}
}
catch (IOException e){
e.printStackTrace();
}
}
}
public class ChatClient{
public static void main(String args[]){
try{
Socket s = new Socket(«localhost»,1234);
try{
InputStream inStream = s.getInputStream();
OutputStream outStream = s.getOutputStream();
Scanner in = new Scanner(inStream);
Scanner userin = new Scanner(System.in);
PrintWriter out = new PrintWriter(outStream,true);
while(in.hasNextLine()){
String line = in.nextLine();
System.out.println(line);
if (!line.equals(«Echo: BYE»)) out.println(userin.nextLine());
}
}
finally{
s.close();
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
Возник один вопрос.
Не могу разобраться, как настроить краулинг через прокси… Кто-нибудь сталкивался?
Пример:
Второй пример будет работать медленнее, чем первый. Т.к. в первом используется сокращённая схема вычислений, а во втором полная.
Короче говоря, иметь представление об альтернативных вариантах — полезно. Т.к. они могут встретиться в старом коде (когда тернарный оператор ещё не был введён). Но в новом коде следует использовать только первый вариант. Читаемость кода — это тоже немаловажный фактор, согласитесь ;)
+1
Скрыть пустые группы, скрыть контакты оффлайн — это всё что мне нужно, чтобы начать пользоваться вашим клиентом )
А так всё в духе времени )
Чтобы что-то развалить — для начала нужно построить ;)
Пока же немного настораживает обилие громких слов.
Хотя с тругой стороны автор говорит о наличии опыта.
В любом случае эксперимент интересный! :) Хотелось бы поучавствовать.
Взялся за третью задачу. Т.к. первые две для меня не интересны.
Впервые стал разбираться с многопоточностью.
Первые три подзадачи сделал. А вот на четвёртом пункте подзастрял. Пока не могу сообразить как сделать так, чтобы введённое одним пользователем — выводилось сразу у всех. Нужно как-то передавать информацию между потоками. Как это обычно делается? Т.е. чтобы один поток пробуждал все остальные.
Подсказки от вас могут быть? =) Вот реализация первых трёх пунктов. Она немного изменена, т.к. я работал над четвёртым. Запись в файл, к примеру, в первых трёх пунктах не нужна. Пока не пойму потребуется ли она вдальнейшем.
Класс chat
package ru.chat;
import java.io.*;
import java.net.*;
public class chat {
public static void main(String args[]){
try{
int i =1;
ServerSocket s = new ServerSocket(1234);
while (true){
Socket incoming = s.accept();
System.out.println(«Swaping „+i);
Runnable r = new ThreadedChatHandler(incoming);
Thread t = new Thread®;
t.start();
i++;
}
}
catch (IOException e){
e.printStackTrace();
}
}
}
класс ThreadedChatHandler
package ru.chat;
import java.io.*;
import java.net.*;
import java.util.*;
public class ThreadedChatHandler implements Runnable{
public ThreadedChatHandler(Socket i){
incoming = i;
}
public synchronized void run(){
try{
try{
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true);
RandomAccessFile fileIn = new RandomAccessFile(“history.txt»,«r»);
fileIn.skipBytes((int)fileIn.length());
out.println(«Hello! Enter BYE to exit.»);
String answer = "";
while (answer != null){
String line = in.nextLine();
FileWriter fileWrite = new FileWriter(«history.txt»,true);
fileWrite.write(«Echo: „+line+“\n»);
fileWrite.close();
answer = fileIn.readLine();
out.println(answer);
if (line.trim().equals(«BYE»)) break;
}
}
catch (FileNotFoundException e){
e.printStackTrace();
}
finally{
incoming.close();
}
return;
}
catch(IOException e){
e.printStackTrace();
}
}
private Socket incoming;
}
класс ChatClient
package ru.chat;
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatClient{
public static void main(String args[]){
try{
Socket s = new Socket(«localhost»,1234);
try{
InputStream inStream = s.getInputStream();
OutputStream outStream = s.getOutputStream();
Scanner in = new Scanner(inStream);
Scanner userin = new Scanner(System.in);
PrintWriter out = new PrintWriter(outStream,true);
while(in.hasNextLine()){
String line = in.nextLine();
System.out.println(line);
if (!line.equals(«Echo: BYE»)) out.println(userin.nextLine());
}
}
finally{
s.close();
}
}
catch(IOException e){
e.printStackTrace();
}
}
}