Ифодаҳо-литералҳо
Дастгирӣ мешаванд навъи зерин ифодаҳои литерал: риштаҳо, арзишҳои ададӣ (int, real, hex), булевӣ ва null. Риштаҳо аз якчанд зарфҳо тақсим мешаванд. Барои дохил кардани худи зарф дар ришта, истифода баред ду аломати якчанд зарф.
Дар рӯйхати зерин истифодаи соддаи литералҳоро нишон медиҳад. Одатан онҳо изолятсия нашудаанд, мисли дар ин ҳол, балки ҳамчун қисми ифодаи мураккабтар - масалан, ҳангоми истифодаи литерал бо як тарафи оператори муқоисавӣ мантиқӣ.
ExpressionParser parser = new SpelExpressionParser();
// дорои арзиши "Hello World"
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();
// мешавад 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();
boolean trueValue = (Boolean) parser.parseExpression("true").getValue();
Object nullValue = parser.parseExpression("null").getValue();
val parser = SpelExpressionParser()
// дорои арзиши "Hello World"
val helloWorld = parser.parseExpression("'Hello World'").value as String
val avogadrosNumber = parser.parseExpression("6.0221415E+23").value as Double
// мешавад 2147483647
val maxValue = parser.parseExpression("0x7FFFFFFF").value as Int
val trueValue = parser.parseExpression("true").value as Boolean
val nullValue = parser.parseExpression("null").value
Ададҳо истифодаи аломати манфӣ, шакли экспоненсиалии намоиш ва нуқтаҳои даҳӣ дастгирӣ мекунанд. Бо нобаёнӣ ададҳои воқеӣ бо истифодаи Double.parseDouble()
парс карда мешаванд.
Ҳосиятҳо, массивҳо, рӯйхатҳо, массивҳои ассоциативӣ ва индексаторҳо
Навигатсия бо ёрии истинодҳо ба ҳосиятҳо осон аст. Барои ин нукта истифода баред, то арзиши ҳосияти васлшударо нишон диҳед. Экземпляри синфи Inventor
, pupin
ва tesla
, пур аз додашуда буданд. Барои ҳаракат кардани "поён" дар графи объектҳо ва гирифтани соли таваллуд Тесла ва шаҳри таваллуд Пупин, мо ифодаҳои зеринро истифода мебарем:
// мешавад 1856
int year = (Integer) parser.parseExpression("birthdate.year + 1900").getValue(context);
String city = (String) parser.parseExpression("placeOfBirth.city").getValue(context);
// мешавад 1856
val year = parser.parseExpression("birthdate.year + 1900").getValue(context) as Int
val city = parser.parseExpression("placeOfBirth.city").getValue(context) as String
Номутахассисият ба регистр барои ҳарфи аввал номи ҳосиятҳо иҷозат дода мешавад. Ҳамин тариқ, ифодаҳо дар намунаи овардашуда метавонанд ҳамчун Birthdate.Year + 1900
ва PlaceOfBirth.City
, мутаносибан навишта шаванд. Илова бар ин, ба маҳсулот метавон тавассути зангҳо ба функсияҳо муроҷиат кард — масалан, getPlaceOfBirth().getCity()
ба ҷойи placeOfBirth.city
.
Мундариҷаи массивҳо ва рӯйхатҳо мумкин аст гирифта шавад, истифодаи сабти бо истифодаи квадрати квадратҳо, ҳамон тавре, ки дар намунаи зерин нишон дода шудааст:
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
// Массиви ихтироолетҳо
// дорои арзиши "Induction motor"
String invention = parser.parseExpression("inventions[3]").getValue(
context, tesla, String.class);
// Рӯйхати аъзоён
// дорои арзиши "Nikola Tesla".
String name = parser.parseExpression("members[0].name").getValue(
context, ieee, String.class);
// Рӯйхати аъзоён
// дорои арзиши "Wireless communication"
String invention = parser.parseExpression("members[0].inventions[6]").getValue(
context, ieee, String.class);
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()
// Массиви ихтироолетҳо
// дорои арзиши "Induction motor"
val invention = parser.parseExpression("inventions[3]").getValue(
context, tesla, String::class.java)
// Рӯйхати аъзоён
// дорои арзиши "Nikola Tesla".
val name = parser.parseExpression("members[0].name").getValue(
context, ieee, String::class.java)
// Рӯйхати аъзоён
// дорои арзиши "Wireless communication"
val invention = parser.parseExpression("members[0].inventions[6]").getValue(
context, ieee, String::class.java)
Мундариҷаи массивҳои ассоциативӣ мумкин аст гирифта шавад, нишон додани арзиши клавиатии калид дар скобкаҳо. Дар намунаи зерин, зеро калидҳо барои массиви ассоциативӣ officers
риштаҳо мебошанд, мо метавонем риштаи хавосиҳоро нишон диҳем:
// Луғати афсарон
Inventor pupin = parser.parseExpression("officers['president']").getValue(
societyContext, Inventor.class);
// дорои арзиши "Idvor"
String city = parser.parseExpression("officers['president'].placeOfBirth.city").getValue(
societyContext, String.class);
// муайян кардани арзишҳо
parser.parseExpression("officers['advisors'][0].placeOfBirth.country").setValue(
societyContext, "Croatia");
// Луғати афсарон
val pupin = parser.parseExpression("officers['president']").getValue(
societyContext, Inventor::class.java)
// дорои арзиши "Idvor"
val city = parser.parseExpression("officers['president'].placeOfBirth.city").getValue(
societyContext, String::class.java)
// муайян кардани арзишҳо
parser.parseExpression("officers['advisors'][0].placeOfBirth.country").setValue(
societyContext, "Croatia")
Рӯйхатҳои дарунсохт
Шумо метавонед фавран риштаҳоро дар ифода нишон диҳед, истифодаи нотацияи {}
.
// муайян карда мешавад ҳамчун рӯйхати Java, ки дорои чор адад аст
List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue(context);
List listOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue(context);
// муайян карда мешавад ҳамчун рӯйхати Java, ки дорои чор адад аст
val numbers = parser.parseExpression("{1,2,3,4}").getValue(context) as List<*>
val listOfLists = parser.parseExpression("{{'a','b'},{'x','y'}}").getValue(context) as List<*>
{}
худ ба худ маънои рӯйхати холӣ дорад. Бо назардошти омилҳои иҷроишӣ, агар рӯйхат комилан аз литералҳои собит иборат бошад, барои намояндагии ифода рӯйхати константаҳо эҷод карда мешавад (ба ҷои он ки ҳар дафъа як рӯйхати нав сохта шавад).
Дарунсохти Map
Шумо инчунин метавонед ба таври мустақим Map-ро дар ифода нишон диҳед, истифодаи нотацияи {key:value}
. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна ин корро кунед:
// муайян карда мешавад ҳамчун Java Map, ки дорои ду сабт аст
Map inventorInfo = (Map) parser.parseExpression("{name:'Nikola',dob:'10-July-1856'}").getValue(context);
Map mapOfMaps = (Map) parser.parseExpression("{name:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}").getValue(context);
// муайян карда мешавад ҳамчун Java Map, ки дорои ду сабт аст
val inventorInfo = parser.parseExpression("{name:'Nikola',dob:'10-July-1856'}").getValue(context) as Map<*, *>
val mapOfMaps = parser.parseExpression("{name:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}").getValue(context) as Map<*, *>
{:}
худ ба худ маънои Map-и холӣ дорад. Бо назардошти омилҳои иҷроишӣ, агар Map худ аз литералҳои собит ё дигар сохторҳои дохилӣ (рӯйхатҳо ё Map) иборат бошад, барои намояндагии ифода Map-и константаҳо эҷод карда мешавад (ба ҷои он ки ҳар дафъа як Map-и нав сохта шавад). Нишон додани калидҳо дар Map албатта (агар калид нуқта (.) надошта бошад) ғайриимкон аст. Дар намунаҳои зерин кавичкҳо истифода нашудаанд.
Сохтани массивҳо
Шумо метавонед массивҳо созед, истифодаи синтаксиси оддии Java, ки инициализаторро нишон дода метавонад, то массив ҳангоми сохтмон пур карда шавад. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна ин корро кунед:
int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue(context);
// Массив бо инициализатор
int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue(context);
// Массиви бисёрҷанба
int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue(context);
val numbers1 = parser.parseExpression("new int[4]").getValue(context) as IntArray
// Массив бо инициализатор
val numbers2 = parser.parseExpression("new int[]{1,2,3}").getValue(context) as IntArray
// Массиви бисёрҷанба
val numbers3 = parser.parseExpression("new int[4][5]").getValue(context) as Array<IntArray>
Феълан наметавон инициализаторро ҳангоми сохтани массиви бисёрҷанбаи муайян нишон дод.
Методҳо
Шумо метавонед методҳоро бо истифодаи синтаксиси оддии Java даъват кунед. Шумо инчунин метавонед методҳоро барои литералҳо даъват кунед. Аргументҳои тағйирёбанда низ дастгирӣ карда мешаванд. Дар намунаҳои зерин нишон дода мешавад, ки чӣ гуна методҳоро даъват кунед:
// литерали ришта, ки дорои арзиши "bc" аст
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);
// мешавад true
boolean isMember = parser.parseExpression("isMember('Mihajlo Pupin')").getValue(
societyContext, Boolean.class);
// литерали ришта, ки дорои арзиши "bc" аст
val bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String::class.java)
// мешавад true
val isMember = parser.parseExpression("isMember('Mihajlo Pupin')").getValue(
societyContext, Boolean::class.java)
Операторҳо
Spring Expression Language операторҳои зеринро дастгирӣ мекунад:
-
Операторҳои реляционӣ
-
Операторҳои мантиқӣ
-
Операторҳои математикӣ
-
Оператори додашавӣ
Операторҳои реляционӣ
Операторҳои реляционӣ (баробар, набаробар, камтар аз, камтар аз ё баробар, калонтар аз ва калонтар аз ё баробар) бо истифода аз нотации стандартии оператор дастгирӣ мешаванд. Дар рӯйхати зерин якчанд намунаҳои операторҳо оварда шудаанд:
// мешавад true
boolean trueValue = parser.parseExpression("2 == 2").getValue(Boolean.class);
// мешавад false
boolean falseValue = parser.parseExpression("2 < -5.0").getValue(Boolean.class);
// мешавад true
boolean trueValue = parser.parseExpression("'black' < 'block'").getValue(Boolean.class);
// мешавад true
val trueValue = parser.parseExpression("2 == 2").getValue(Boolean::class.java)
// мешавад false
val falseValue = parser.parseExpression("2 < -5.0").getValue(Boolean::class.java)
// мешавад true
val trueValue = parser.parseExpression("'black' < 'block'").getValue(Boolean::class.java)
Мукоисаи "калон аз" ва "камтар аз" бо null
ба қоидаи оддӣ тобеъ аст: null
ҳамчун чизе нахоста мешавад (ин НЕСТ сифр). Ҳамин тариқ, ҳар як арзиши дигар ҳамеша калонтар аз null(X > null
ҳамеша true
) ва ҳеҷ арзиши дигар ҳеҷ гоҳ камтар аз чизе нахоҳад шуд (X < null
ҳамеша false
).
Агар шумо мукоисаҳои ададиро афзал медонед, аз мукоисаҳои null
дар асоси ададҳо парҳех кунед ба мукоисаҳои бо сифр (масалан, X > 0
ё X < 0
).
Илова бар операторҳои стандартии реляционии SpEL оператори instanceof
ва оператори matches
-ро, ки дар асоси ифодаҳои муқаррарӣ аст дастгирӣ мекунад. Дар рӯйхати зерин намунаҳои ҳарду вариант оварда шудаанд:
// мешавад false
boolean falseValue = parser.parseExpression(
"'xyz' instanceof T(Integer)").getValue(Boolean.class);
// мешавад true
boolean trueValue = parser.parseExpression(
"'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
// мешавад false
boolean falseValue = parser.parseExpression(
"'5.0067' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean.class);
// мешавад false
val falseValue = parser.parseExpression(
"'xyz' instanceof T(Integer)").getValue(Boolean::class.java)
// мешавад true
val trueValue = parser.parseExpression(
"'5.00' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean::class.java)
// мешавад false
val falseValue = parser.parseExpression(
"'5.0067' matches '^-?\\d+(\\.\\d{2})?$'").getValue(Boolean::class.java)
1 instanceof T(int)
мешавад
false
, вале
1 instanceof T(Integer)
мешавад
true
, чунки интизор мерафт.
Ҳар як оператори символьӣ инчунин метавонад ҳамчун эквиваленти ҳарфӣ зикр карда шавад. Ин позволяет избежать проблем, вақте ки символы, которые используются, имеют особое значение для типа документа, в который встраивается выражение (например, в XML-документ). Ҳарфҳои эквивалентҳои чунинанд:
-
lt
(<
) -
gt
(>
) -
le
(<=
) -
ge
(>=
) -
eq
(==
) -
ne
(!=
) -
div
(/
) -
mod
(%
) -
not
(!
).
Ҳамаи операторҳои ҳарфӣ ба регистр ҳассос нестанд.
Операторҳои мантиқӣ
SpEL операторҳои мантиқии зеринро дастгирӣ мекунад:
-
and
(&&
) -
or
(||
) -
not
(!
)
Дар намунаи зерин нишон дода мешавад, ки чӣ гуна операторҳои мантиқиро истифода баред:
// -- AND --
// мешавад false
boolean falseValue = parser.parseExpression("true and false").getValue(Boolean.class);
// мешавад true
String expression = "isMember('Nikola Tesla') and isMember('Mihajlo Pupin')";
boolean trueValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);
// -- OR --
// мешавад true
boolean trueValue = parser.parseExpression("true or false").getValue(Boolean.class);
// мешавад true
String expression = "isMember('Nikola Tesla') or isMember('Albert Einstein')";
boolean trueValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);
// -- NOT --
// мешавад false
boolean falseValue = parser.parseExpression("!true").getValue(Boolean.class);
// -- AND and NOT --
String expression = "isMember('Nikola Tesla') and !isMember('Mihajlo Pupin')";
boolean falseValue = parser.parseExpression(expression).getValue(societyContext, Boolean.class);
// -- AND --
// мешавад false
val falseValue = parser.parseExpression("true and false").getValue(Boolean::class.java)
// мешавад true
val expression = "isMember('Nikola Tesla') and isMember('Mihajlo Pupin')"
val trueValue = parser.parseExpression(expression).getValue(societyContext, Boolean::class.java)
// -- OR --
// мешавад true
val trueValue = parser.parseExpression("true or false").getValue(Boolean::class.java)
// мешавад true
val expression = "isMember('Nikola Tesla') or isMember('Albert Einstein')"
val trueValue = parser.parseExpression(expression).getValue(societyContext, Boolean::class.java)
// -- NOT --
// мешавад false
val falseValue = parser.parseExpression("!true").getValue(Boolean::class.java)
// -- AND and NOT --
val expression = "isMember('Nikola Tesla') and !isMember('Mihajlo Pupin')"
val falseValue = parser.parseExpression(expression).getValue(societyContext, Boolean::class.java)
Операторҳои математикӣ
Оператори ҷамъ (+
) метавонад ҳам барои ададҳо ва ҳам барои риштаҳо истифода шавад. Операторҳои тарҳ (-
), зарб (*
) ва тақсим (/
) танҳо барои ададҳо истифода мешаванд. Операторҳои боқимонда (%
) ва афзоиши экспоненсиалӣ (^
) ҳам барои ададҳо дастгирӣ карда мешаванд. Ҳамаи операторҳои математикӣ ба ҳамон тартиби стандартӣ ба тартиб меоянд. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна операторҳои математикиро истифода баред:
// Ҷамъ
int two = parser.parseExpression("1 + 1").getValue(Integer.class); // 2
String testString = parser.parseExpression(
"'test' + ' ' + 'string'").getValue(String.class); // 'test string'
// Тарҳ
int four = parser.parseExpression("1 - -3").getValue(Integer.class); // 4
double d = parser.parseExpression("1000.00 - 1e4").getValue(Double.class); // -9000
// Зарб
int six = parser.parseExpression("-2 * -3").getValue(Integer.class); // 6
double twentyFour = parser.parseExpression("2.0 * 3e0 * 4").getValue(Double.class); // 24.0
// Тақсим
int minusTwo = parser.parseExpression("6 / -3").getValue(Integer.class); // -2
double one = parser.parseExpression("8.0 / 4e0 / 2").getValue(Double.class); // 1.0
// Боқимонда
int three = parser.parseExpression("7 % 4").getValue(Integer.class); // 3
int one = parser.parseExpression("8 / 5 % 2").getValue(Integer.class); // 1
// Тартиби операторҳо
int minusTwentyOne = parser.parseExpression("1+2-3*8").getValue(Integer.class); // -21
// Ҷамъ
val two = parser.parseExpression("1 + 1").getValue(Int::class.java) // 2
val testString = parser.parseExpression(
"'test' + ' ' + 'string'").getValue(String::class.java) // 'test string'
// Тарҳ
val four = parser.parseExpression("1 - -3").getValue(Int::class.java) // 4
val d = parser.parseExpression("1000.00 - 1e4").getValue(Double::class.java) // -9000
// Зарб
val six = parser.parseExpression("-2 * -3").getValue(Int::class.java) // 6
val twentyFour = parser.parseExpression("2.0 * 3e0 * 4").getValue(Double::class.java) // 24.0
// Тақсим
val minusTwo = parser.parseExpression("6 / -3").getValue(Int::class.java) // -2
val one = parser.parseExpression("8.0 / 4e0 / 2").getValue(Double::class.java) // 1.0
// Боқимонда
val three = parser.parseExpression("7 % 4").getValue(Int::class.java) // 3
val one = parser.parseExpression("8 / 5 % 2").getValue(Int::class.java) // 1
// Тартиби операторҳо
val minusTwentyOne = parser.parseExpression("1+2-3*8").getValue(Int::class.java) // -21
Оператори додашавӣ
Барои муайян кардани ҳосият, аз оператори додашавӣ (=
) истифода баред. Маъмулан ин дар дохили даъвати setValue
анҷом дода мешавад, вале он метавонад дар дохили даъвати getValue
низ анҷом дода шавад. Дар рӯйхати зерин ду усули истифодаи оператори додашавӣ нишон дода шудаанд:
Inventor inventor = new Inventor();
EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();
parser.parseExpression("name").setValue(context, inventor, "Aleksandar Seovic");
// алтернатива
String aleks = parser.parseExpression(
"name = 'Aleksandar Seovic'").getValue(context, inventor, String.class);
val inventor = Inventor()
val context = SimpleEvaluationContext.forReadWriteDataBinding().build()
parser.parseExpression("name").setValue(context, inventor, "Aleksandar Seovic")
// алтернатива
val aleks = parser.parseExpression(
"name = 'Aleksandar Seovic'").getValue(context, inventor, String::class.java)
Намудҳо
Шумо метавонед оператори махсуси T
-ро истифода баред барои муайян кардани экземпляри java.lang.Class
(намуд). Методҳои статикӣ низ бо истифода аз ин оператор даъват карда мешаванд. StandardEvaluationContext
истифодабарии TypeLocator
барои ҷустуҷӯи намудҳоро истифода мебарад, ва StandardTypeLocator
(ки мумкин аст иваз карда шавад) бо назардошти хусусиятҳои бастаи java.lang
сохта шудаст. Ин маъно дорад, ки истинодҳои T()
ба намудҳо аз бастаи java.lang
пурра тавсиф карда намешаванд, аммо дигар истинодҳои намуд бояд пурра тавсиф карда шаванд. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна оператори T
-ро истифода баред:
Class dateClass = parser.parseExpression("T(java.util.Date)").getValue(Class.class);
Class stringClass = parser.parseExpression("T(String)").getValue(Class.class);
boolean trueValue = parser.parseExpression(
"T(java.math.RoundingMode).CEILING < T(java.math.RoundingMode).FLOOR")
.getValue(Boolean.class);
val dateClass = parser.parseExpression("T(java.util.Date)").getValue(Class::class.java)
val stringClass = parser.parseExpression("T(String)").getValue(Class::class.java)
val trueValue = parser.parseExpression(
"T(java.math.RoundingMode).CEILING < T(java.math.RoundingMode).FLOOR")
.getValue(Boolean::class.java)
Конструкторҳо
Шумо метавонед конструкторҳоро бо истифода аз оператори new
даъват кунед. Шумо бояд номи пурра муайяншудаи синфро барои ҳамаи намудҳо, ба истиснои онҳое, ки дар бастаи java.lang(Integer
, Float
, String
ва ғайра) мебошанд истифода баред. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна оператори new
-ро барои даъвати конструкторҳо истифода баред:
Inventor einstein = p.parseExpression(
"new org.spring.samples.spel.inventor.Inventor('Albert Einstein', 'German')")
.getValue(Inventor.class);
// эҷоди экземпляри нави Inventor дар методи add() List
p.parseExpression(
"Members.add(new org.spring.samples.spel.inventor.Inventor(
'Albert Einstein', 'German'))").getValue(societyContext);
val einstein = p.parseExpression(
"new org.spring.samples.spel.inventor.Inventor('Albert Einstein', 'German')")
.getValue(Inventor::class.java)
// эҷоди экземпляри нави Inventor дар методи add() List
p.parseExpression(
"Members.add(new org.spring.samples.spel.inventor.Inventor('Albert Einstein', 'German'))")
.getValue(societyContext)
Тағирёбҳо
Шумо метавонед ба тағирёбҳо дар ифода бо истифодаи синтаксиси #variableName
истинод кунед. Тағйирёбҳо бо истифодаи методи setVariable
дар татбиқоти EvaluationContext
насб карда мешаванд.
Номҳои иҷозатдодашудаи тағирёбҳо бояд аз як ё якчанд аз ин нишони дастгирӣшаванда иборат бошанд.
-
ҳарфҳо: аз
A
тоZ
ва азa
тоz
-
рақамҳо: аз
0
то9
-
захминкунӣ:
_
-
аломатии доллар:
$
Дар намунаи зерин нишон дода мешавад, ки чӣ гуна тағирёбҳоро истифода баред.
Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();
context.setVariable("newName", "Mike Tesla");
parser.parseExpression("name = #newName").getValue(context, tesla);
System.out.println(tesla.getName()) // "Mike Tesla"
val tesla = Inventor("Nikola Tesla", "Serbian")
val context = SimpleEvaluationContext.forReadWriteDataBinding().build()
context.setVariable("newName", "Mike Tesla")
parser.parseExpression("name = #newName").getValue(context, tesla)
println(tesla.name) // "Mike Tesla"
Тағирёбҳои #this
ва #root
Тағирёби #this
ҳамеша муайян гардида аст ва ба объекти ҷорӣ барои ҳисобкунӣ ишора мекунад (нисбат ба он ки истинодҳои бесифат ҳал мешаванд). Тағирёби #root
ҳамеша муайян гардида аст ва ба объекти решаи контекст ишора мекунад. Ҳарчанд ки #this
метавонад ҳангоми ҳисоб кардани компонентҳои ифода тағйир ёбад, #root
ҳамеша бо реша дахл дорад. Дар намунаҳои зерин нишон дода мешавад, ки чӣ гуна тағирёбҳои #this
ва #root
-ро истифода баред:
// эҷоди массиви ададенияи
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
// эҷоди парсер ва насб кардани тағирёб "primes" ҳамчун массиви ададенияи
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataAccess();
context.setVariable("primes", primes);
// ҳама ададенияи ибтидоӣ > 10 аз рӯйхат (истифодаи интихоб ?{...})
// мешавад [11, 13, 17]
List<Integer> primesGreaterThanTen = (List<Integer>) parser.parseExpression(
"#primes.?[#this>10]").getValue(context);
// эҷоди массиви ададенияи
val primes = ArrayList<Int>()
primes.addAll(listOf(2, 3, 5, 7, 11, 13, 17))
// эҷоди парсер ва насб кардани тағирёб "primes" ҳамчун массиви ададенияи
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataAccess()
context.setVariable("primes", primes)
// ҳама ададенияи ибтидоӣ > 10 аз рӯйхат (истифодаи интихоб ?{...})
// мешавад [11, 13, 17]
val primesGreaterThanTen = parser.parseExpression(
"#primes.?[#this>10]").getValue(context) as List<Int>
Функсияҳо
Шумо метавонед SpEL-ро васеъ кунед, сабт кардани функсияҳои истифодабарандаи муайяншаванда, ки метавонанд дар сатри ифода даъват шаванд. Функсия бо истифода аз EvaluationContext
сабт карда мешавад. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна функсияи истифодабарандаи муайяншавандаро сабт кунед:
Method method = ...;
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
context.setVariable("myFunction", method);
val method: Method = ...
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()
context.setVariable("myFunction", method)
Масалан, мо метавонем функсияи кӯмаки зерро сабт кунем, ки риштаро ба акси он табдил медиҳад:
public abstract class StringUtils {
public static String reverseString(String input) {
StringBuilder backwards = new StringBuilder(input.length());
for (int i = 0; i < input.length(); i++) {
backwards.append(input.charAt(input.length() - 1 - i));
}
return backwards.toString();
}
}
fun reverseString(input: String): String {
val backwards = StringBuilder(input.length)
for (i in 0 until input.length) {
backwards.append(input[input.length - 1 - i])
}
return backwards.toString()
}
Пас мо метавонем функсияи болоро сабт кунем ва истифода барем, тавре ки дар намунаи зерин нишон дода шудааст:
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
context.setVariable("reverseString",
StringUtils.class.getDeclaredMethod("reverseString", String.class));
String helloWorldReversed = parser.parseExpression(
"#reverseString('hello')").getValue(context, String.class);
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()
context.setVariable("reverseString", ::reverseString::javaMethod)
val helloWorldReversed = parser.parseExpression(
"#reverseString('hello')").getValue(context, String::class.java)
Истинод ба бин
Агар контексти ҳисобкунӣ бо истифодаи ҳалкунандаи бин конфигуратсия шуда бошад, шумо метавонед ҷустуҷӯи биниҳоро дар ифода бо истифодаи символи @
иҷро кунед. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна ин корро кунед:
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new MyBeanResolver());
// Ин хоҳандрасонидани resolve(context, "something") барои MyBeanResolver ҳангоми ҳисобкунӣ
Object bean = parser.parseExpression("@something").getValue(context);
val parser = SpelExpressionParser()
val context = StandardEvaluationContext()
context.setBeanResolver(MyBeanResolver())
// Ин хоҳандрасонидани resolve(context, "something") барои MyBeanResolver ҳангоми ҳисобкунӣ
val bean = parser.parseExpression("@something").getValue(context)
Барои дастрасӣ ба худи фабрикаи бин, бояд ба ҷойи номи бин аломати &
гузошта шавад. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна ин корро кунед:
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new MyBeanResolver());
// Ин хоҳандрасонидани resolve(context,"&foo") барои MyBeanResolver ҳангоми ҳисобкунӣ
Object bean = parser.parseExpression("&foo").getValue(context);
val parser = SpelExpressionParser()
val context = StandardEvaluationContext()
context.setBeanResolver(MyBeanResolver())
// Ин хоҳандрасонидани resolve(context,"&foo") барои MyBeanResolver ҳангоми ҳисобкунӣ
val bean = parser.parseExpression("&foo").getValue(context)
Оператори тернарӣ (If-Then-Else)
Шумо метавонед оператори тернарӣ барои иҷрои мантиқии гузариши шартии if-then-else (агар-баъд-иначе) дар дохили ифода истифода баред. Дар рӯйхати зерин намунаи простарин оварда шудааст:
String falseString = parser.parseExpression(
"false ? 'trueExp' : 'falseExp'").getValue(String.class);
val falseString = parser.parseExpression(
"false ? 'trueExp' : 'falseExp'").getValue(String::class.java)
Дар ин ҳолат false
булевӣ ба баргаштан арзиши риштаии 'falseExp'
оварда мерасонад. Дар зерин намунаи амалии бештар оварда шудааст:
parser.parseExpression("name").setValue(societyContext, "IEEE");
societyContext.setVariable("queryName", "Nikola Tesla");
expression = "isMember(#queryName)? #queryName + ' is a member of the ' " +
"+ Name + ' Society' : #queryName + ' is not a member of the ' + Name + ' Society'";
String queryResultString = parser.parseExpression(expression)
.getValue(societyContext, String.class);
// queryResultString = "Nikola Tesla is a member of the IEEE Society"
parser.parseExpression("name").setValue(societyContext, "IEEE")
societyContext.setVariable("queryName", "Nikola Tesla")
expression = "isMember(#queryName)? #queryName + ' is a member of the ' " + "+ Name + ' Society' : #queryName + ' is not a member of the ' + Name + ' Society'"
val queryResultString = parser.parseExpression(expression)
.getValue(societyContext, String::class.java)
// queryResultString = "Nikola Tesla is a member of the IEEE Society"
Ба боби зерин роҷеъ ба Элвис-оператор барои синтаксиси кӯтоҳтари оператори тернарӣ нигаред.
Элвис-оператор
Элвис-оператор (Elvis operator) кӯтоҳтари синтаксиси оператори тернарӣ аст ва дар забони Groovy истифода мешавад. Ҳангоми истифодаи синтаксиси оператори тернарӣ одатан лозим аст, ки тағирёбро ду маротиба такрор кунед, тавре ки дар намунаи зерин нишон дода шудааст:
String name = "Elvis Presley";
String displayName = (name != null ? name : "Unknown");
Ба ҷои ин шумо метавонед Элвис-операторро истифода баред (номбаршуда бо сабаби монандӣ бо мӯи сари Элвис Пресли). Дар намунаи зерин нишон дода шудааст, ки чӣ гуна Элвис-операторро истифода баред:
ExpressionParser parser = new SpelExpressionParser();
String name = parser.parseExpression("name?:'Unknown'").getValue(new Inventor(), String.class);
System.out.println(name); // 'Unknown'
val parser = SpelExpressionParser()
val name = parser.parseExpression("name?:'Unknown'").getValue(Inventor(), String::class.java)
println(name) // 'Unknown'
Дар рӯйхати зерин намунаи мураккабтар нишон дода шудааст:
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
String name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String.class);
System.out.println(name); // Nikola Tesla
tesla.setName(null);
name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String.class);
System.out.println(name); // Elvis Presley
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()
val tesla = Inventor("Nikola Tesla", "Serbian")
var name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String::class.java)
println(name) // Nikola Tesla
tesla.setName(null)
name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String::class.java)
println(name) // Elvis Presley
Шумо метавонед Элвис-операторро барои истифодаи арзишҳои пешфарз дар ифодаҳо истифода баред. Дар намунаи зерин нишон дода шудааст, ки чӣ гуна Элвис-операторро дар ифода истифода баред, ки бо @Value
ишора шудааст:
@Value("#{systemProperties['pop3.port'] ?: 25}")
Пас шумо системаи сахтафзории pop3.port
-ро мегиред, агар он муқарраршуда бошад, ё 25 агар номуқарраршуда бошад.
Оператори навбатгирии бехатарӣ
Оператори навбатгирии бехатарӣ барои пешгирӣ кардани NullPointerException
истифода мешавад ва аз забони Groovy сарчашма мегирад. Одатан, агар дар чунин ҳолат бошад, объект, пас метавонад лозим бошад, ки санҷиш кунад, ки он холӣ нест, пеш аз он ки ба методҳо ё маҳсулоти объект муроҷиат кунад. Бо мақсади пешгирӣ кардан, оператори навбатгирии бехатарӣ ба ҷои барангехти истисно null медиҳад. Дар намунаи зерин нишон дода мешавад, ки чӣ гуна оператори навбатгирии бехатариро истифода баред:
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
tesla.setPlaceOfBirth(new PlaceOfBirth("Smiljan"));
String city = parser.parseExpression("placeOfBirth?.city").getValue(context, tesla, String.class);
System.out.println(city); // Smiljan
tesla.setPlaceOfBirth(null);
city = parser.parseExpression("placeOfBirth?.city").getValue(context, tesla, String.class);
System.out.println(city); // null - не генерирует NullPointerException!!!
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()
val tesla = Inventor("Nikola Tesla", "Serbian")
tesla.setPlaceOfBirth(PlaceOfBirth("Smiljan"))
var city = parser.parseExpression("placeOfBirth?.city").getValue(context, tesla, String::class.java)
println(city) // Smiljan
tesla.setPlaceOfBirth(null)
city = parser.parseExpression("placeOfBirth?.city").getValue(context, tesla, String::class.java)
println(city) // null - не генерирует NullPointerException!!!
Интихоб кардани коллексияҳо
Интихоб (selection) – ин функсияи пурқуввати забони ифодаҳо аст, ки имкон медиҳад, ки коллексияи аввалия ба коллексияи дигар табдил дода шавад тавассути интихоб кардани сабтҳояш.
Барои интихоб аз синтак
GO TO FULL VERSION